C# 将前2列编码为primarykey/索引

C# 将前2列编码为primarykey/索引,c#,database,entity-framework,ef-code-first,C#,Database,Entity Framework,Ef Code First,所以我得到了一个名为ObjectA的类,它有很多ObjectsB,这些对象有一个Id,用来识别它们,还有一种语言(enum,但它实际上保存为和INT,在这种情况下也不重要) 公共类ObjectA { 公共int Id{get;set;} 公共语言{get;set;} …//和objectA属性的列表 公共虚拟ICollection对象{get;set;} } 公共类对象B { 公共int Id{get;set;} 公共语言{get;set;} …//和objectB属性列表 公共对象对象对象{g

所以我得到了一个名为ObjectA的类,它有很多ObjectsB,这些对象有一个Id,用来识别它们,还有一种语言(enum,但它实际上保存为和INT,在这种情况下也不重要)

公共类ObjectA
{
公共int Id{get;set;}
公共语言{get;set;}
…//和objectA属性的列表
公共虚拟ICollection对象{get;set;}
}
公共类对象B
{
公共int Id{get;set;}
公共语言{get;set;}
…//和objectB属性列表
公共对象对象对象{get;set;}
}
现在我学会了如何将它们映射为主键,我使用fluentapi来实现这一点。我知道您也可以使用[Key]和[Column]属性(我不使用):

modelBuilder.Entity().HasKey(a=>new{a.Id,a.Languague})
modelBuilder.Entity().HasKey(a=>new{a.Id,a.Languague})
现在我尝试了很多东西,但我似乎无法将它们相互联系起来。有人知道我如何解决这个问题吗?

如果一对多关系中的主体(
ObjectA
)具有复合主键,则从属(
ObjectB
)也必须具有由相同列数组成的外键

我假设相关对象A和对象B必须具有相同的语言。在这种情况下,可以将
ObjectB.Language
作为外键的第一部分。(它同时是
ObjectB
中主键和外键的一部分。)如果在模型中将FK的第二部分作为属性公开,它将如下所示:

(我相信您必须交换
Id
Language
,才能使以下各项正常工作。)

…和地图:

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.TheObjectALanguage, b.TheObjectAId });
如果您不想在模型中具有FK属性,您可以将
MapKey
与Fluent API结合使用:

modelBuilder.Entity<ObjectA>().HasKey(a => new { a.Languague, a.Id })
modelBuilder.Entity<ObjectB>().HasKey(b => new { b.Languague, b.Id })

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.Language, b.TheObjectAId });
modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .Map(m => m.MapKey("TheObjectALanguage, TheObjectAId")); // FK columns
modelBuilder.Entity()
.HasMany(a=>a.ObjectBs)
.WithRequired(b=>b.ObjectA)
.Map(m=>m.MapKey(“对象语言,对象辅助”);//FK柱

可能重复:是否尝试使用ID和语言字段的复合主键?有没有不使用键和列属性的原因?你在用EF5吗?
modelBuilder.Entity<ObjectA>().HasKey(a => new { a.Languague, a.Id })
modelBuilder.Entity<ObjectB>().HasKey(b => new { b.Languague, b.Id })

modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.Language, b.TheObjectAId });
    public Language TheObjectALanguage {get;set;}
    public int TheObjectAId {get;set;}
    public ObjectA TheObjectA {get;set;}
modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .HasForeignKey(b => new { b.TheObjectALanguage, b.TheObjectAId });
public Language? TheObjectALanguage {get;set;}
public int? TheObjectAId {get;set;}
modelBuilder.Entity<ObjectA>()
    .HasMany(a => a.ObjectBs)
    .WithRequired(b => b.ObjectA)
    .Map(m => m.MapKey("TheObjectALanguage, TheObjectAId")); // FK columns