【问题标题】:EF core 2 composite primary key using Id and a foreign key使用 Id 和外键的 EF 核心 2 复合主键
【发布时间】:2019-09-16 19:52:32
【问题描述】:

我有两个模型类

    public class ClassA 
    {
        public Guid Id { get; set; }        

        public IEnumerable<ClassB> ClassBs { get; set; }

    }

    public class ClassB 
    {
        public String Id { get; set; }                

    }

我如何告诉实体框架使用具有 ClassA.Id 和 ClassB.Id 的复合主键创建表 ClassB?这样我就可以在 ClassB 表中拥有多个具有相同 ID 的记录。 我不想更改 ClassB 以添加另一个 Guid Id 属性。我也不想使用 EF 属性,我想保持模型类与 ORM 框架分离。

【问题讨论】:

  • I don't want to change ClassB to add another Guid Id property. I don't want to use EF attributes either-请进一步解释。
  • 检查我的答案。
  • 我正在探索在现有代码中采用 EF 的可能性,希望尽可能避免更改当前模型。
  • 如果不添加外键你会怎么做?

标签: c# .net-core entity-framework-core


【解决方案1】:

如果您不想将显式 FK 属性引入 ClassB 模型,您可以利用 HasKey 接收 string 属性名称的非 lambda 重载并传递 shadow FK 属性名称,按照惯例这个模型是“ClassAId”:

modelBuilder.Entity<ClassB>()
    .HasKey("Id", "ClassAId");

这种方法的一个缺点是使用了“魔术”字符串。但可以在nameof 运算符的帮助下避免这种情况。

另一个缺点是检索/操作 ClassB 对象的唯一方法是通过父 ClassA 对象(尽管在 EF Core LINQ to Entities 查询中,您可以使用 EF.Property&lt;Guid&gt;(param, "ClassAId") 访问它以进行过滤/排序/投影如果需要)。

【讨论】:

    【解决方案2】:

    写你的ClassB如下:

    public class ClassB 
    {
        public String Id { get; set; }
    
        public Guid ClassAId {get; set;}
    
        ...............
    
        public ClassA ClassA  {get; set;}               
    
    }
    

    然后编写ClassB配置如下:

    public class ClassBConfiguration : IEntityTypeConfiguration<ClassB>
    {
        public void Configure(EntityTypeBuilder<ClassB> builder)
        {
            builder.HasKey(b => new { b.Id, b.ClassAId });
    
            builder.HasOne(b => b.ClassA).WithMany(a => a.ClassBs).HasForeignKey(b => b.ClassAId);
        }
    }
    

    然后在OnModelCreating中如下:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.ApplyConfiguration(new ClassBConfiguration());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多