如何获取身份 ID 类型 guid 并分配给另一个表中的外键 ID在 Asp.net Core 中应用

问题描述

我在我的项目中使用 Fluent-API(ASP.NET Core MVC 中的 EF Core)将代码映射到 sql Server 中的数据库,但我面临外键问题:

enter image description here

请帮帮我!

我有 LoaiDichVu 类和 LoaiDichVuConfiguration 类如下:

public class LoaiDichVu
{
    public Guid ID { get; set; }
    public string tenLoaiDichVu { get; set; }
    public string moTa { get; set; }
    public string trangThai { get; set; }

    public string fields1 { get; set; }
    public string fields2 { get; set; }
    public string fields3 { get; set; }
    public string fields4 { get; set; }
    public string fields5 { get; set; }

    public ICollection<DichVu> ICDichVu { get; set; }
}

public class LoaiDichVuConfiguration : IEntityTypeConfiguration<LoaiDichVu>
{
    public void Configure(EntityTypeBuilder<LoaiDichVu> builder)
    {
        builder.ToTable("LoaiDichVu");
        builder.HasKey(ldv => ldv.ID);
        builder.Property(ldv => ldv.ID).HasDefaultValuesql("newsequentialid()");
        builder.Property(ldv => ldv.tenLoaiDichVu).HasMaxLength(30);
        builder.Property(ldv => ldv.moTa).HasMaxLength(60);
        builder.Property(ldv => ldv.trangThai).HasMaxLength(30);
    }
}

而且,我有 DichVuDichVuConfiguration 类如下:

public class DichVu
{
    public Guid ID { get; set; }
    public Guid ID_LoaiDichVu { get; set; }
    public LoaiDichVu LoaiDichVu { get; set; }
    //Tên dịch vụ: Nước khoáng...
    public string tenDichVu { get; set; }
    //Đơn vị tính: Chiếc/ cái/ bao...
    public string donViTinh { get; set; }
    public decimal donGia { get; set; }
    //Đơn vị tính: VNĐ
    public string donViTien  { get; set; }
    public string moTa { get; set; }
    public string trangThai { get; set; }

    public string fields1 { get; set; }
    public string fields2 { get; set; }
    public string fields3 { get; set; }
    public string fields4 { get; set; }
    public string fields5 { get; set; }

    public ICollection<ChiTiet_HoaDon> ICChiTietHoaDon { get; set; }
}

public class DichVuConfiguration : IEntityTypeConfiguration<DichVu>
{
    public void Configure(EntityTypeBuilder<DichVu> builder)
    {
        builder.ToTable("DichVu");
        builder.HasKey(dv => dv.ID);
        builder.Property(dv => dv.ID).HasDefaultValuesql("newsequentialid()");
        builder.Property(dv => dv.tenDichVu).HasMaxLength(50);
        builder.Property(dv => dv.donViTinh).HasMaxLength(20);
        builder.Property(dv => dv.donViTien).HasMaxLength(10);
        builder.Property(dv => dv.moTa).HasMaxLength(100);
        builder.Property(dv => dv.trangThai).HasMaxLength(30);
        builder.HasOne(dv => dv.LoaiDichVu).WithMany(dv => dv.ICDichVu).HasForeignKey(dv => dv.ID_LoaiDichVu).OnDelete(DeleteBehavior.NoAction);
    }
}

然后,我有一个 ModelBuilderExtensions 类:

public static class ModelBuilderExtensions
{
    public static void Seed(this ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<LoaiDichVu>().HasData(
                new LoaiDichVu() { ID = Guid.NewGuid(),tenLoaiDichVu = "Eat" }
               );
        modelBuilder.Entity<DichVu>().HasData(
                new DichVu() { ID = Guid.NewGuid(),ID_LoaiDichVu = Guid.NewGuid(),tenDichVu = "Rice",donGia = 99}
               );
    }
}

我已成功添加迁移。

如果我如上设置 ID_LoaiDichVu,我会收到以下错误

enter image description here

我不知道如何从 LoaiDichVu 表中获取 ID 以分配给 ID_LoaiDichVu 表中的 DichVu

请指导我如何通过代码分配而不是复制和分配

示例:LoaiDichVu(ID = 63763eb2-e537-4b97-a394-0529d216aa74)

然后赋值

DichVu (ID = Guid.NewGuid(),ID_LoaiDichVu = 63763eb2-e537-4b97-a394-0529d216aa74)

谢谢! :)

解决方法

您可以将 Guid 的值分配给一个变量,然后将其分配给 ID (LoaiDichVu) 和 ID_LoaiDichVu 初始化数据时。

public static class ModelBuilderExtensions
{
    public static void Seed(this ModelBuilder modelBuilder)
    {
        var LoaiDichVuId = Guid.NewGuid();
        modelBuilder.Entity<LoaiDichVu>().HasData(
                new LoaiDichVu() { ID = LoaiDichVuId,tenLoaiDichVu = "Eat",}
               );
        modelBuilder.Entity<DichVu>().HasData(
                new DichVu() { ID = Guid.NewGuid(),ID_LoaiDichVu = LoaiDichVuId,tenDichVu = "Rice",donGia = 99 }
               );
    }
}

enter image description here