c# - 可以使用 DbModelBuilder 声明复合主键吗?

标签 c# entity-framework

我的数据库中有一个表,其复合主键由 foo 和 bar 组成。如果我这样做

private static void EfMapMyTableAdded(DbModelBuilder modelBuilder)
{
     var myTableEntity = modelBuilder.Entity<MyTable>();
     myTableEntity.ToTable("myTable");
     myTableEntity.HasKey(f => f.foo)
         .Property(f => f.foo)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

foo bar val
1   1   5
1   2   6

我用值 7 更新第一条记录,它也会更新第二条记录。但是如果我使用

private static void EfMapMyTableAdded(DbModelBuilder modelBuilder)
{
     var myTableEntity = modelBuilder.Entity<MyTable>();
     myTableEntity.ToTable("myTable");
     myTableEntity.HasKey(f => f.foo)
         .Property(f => f.foo)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
     myTableEntity.HasKey(b => b.bar)
         .Property(b => b.bar)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

它更新只更新第一行,这就是我想要的。这是处理 EF 中复合主键的可接受方式吗?

最佳答案

要声明复合键,您需要使用匿名投影:

myTableEntity.HasKey(f => new { f.foo, f.bar});

键的顺序将按照您定义的顺序排列,因此 foo 此处为 order=0,bar 为 order=1。

另一种选择是使用数据注释:

public class myTableEntity
{   
    [Key, Column(Order=0)]
    public int foo {get; set;}

    [Key, Column(Order=1)]
    public int bar {get; set;}
}

关于c# - 可以使用 DbModelBuilder 声明复合主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301589/

相关文章:

c# - 如何删除没有子类别的类别

c# - 关于 DbSet 和 DbContext

entity-framework - EF Code First "Invalid column name ' 鉴别器''但没有继承

c# - WPF ComboBox 获取突出显示的项目

c# - 存储库模式中方法的命名约定?

c# - XNA 框架中的计时器

由连字符分隔的 x 组 A-Z 的 C# 正则表达式

C#-Linq : Unable to create a constant value of type Only primitive types or enumeration types are supported in this context.

c# - 我可以使用什么数学公式来获取给定日期的日期(例如星期五)?

c# - LINQ 除了获取所有行