如果ObjectA
一对多关系中的主体 ( ) 具有复合主键,则从属 ( ObjectB
) 也必须具有由相同数量的列组成的外键。
我假设相关对象 A 和对象 B 必须具有相同的语言。在这种情况下,您可以制作ObjectB.Language
外键的第一部分。(它同时是主键和外键的一部分ObjectB
。)如果将 FK 的第二部分作为模型中的属性公开,它将如下所示:
(我相信你必须交换Id
和Language
以下工作。)
public class ObjectA
{
public Languague Languague {get;set;}
public int Id {get;set;}
... // and a list of objectA properties
public virtual ICollection<ObjectB> ObjectBs {get;set;}
}
public class ObjectB
{
public Languague Languague {get;set;}
public int Id {get;set;}
... // and a list of objectB properties
public int TheObjectAId {get;set;}
public ObjectA TheObjectA {get;set;}
}
以及使用 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 });
如果语言可以不同,请为该语言引入一个单独的 FK 属性:
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 });
如果关系是可选的,请使用WithOptional
而不是WithRequired
并使 FK 属性可为空:
public Language? TheObjectALanguage {get;set;}
public int? TheObjectAId {get;set;}
如果您不想在模型中使用 FK 属性,您可以将MapKey
其与 Fluent API 一起使用:
modelBuilder.Entity<ObjectA>()
.HasMany(a => a.ObjectBs)
.WithRequired(b => b.ObjectA)
.Map(m => m.MapKey("TheObjectALanguage, TheObjectAId")); // FK columns