0

所以我有一个名为 ObjectA 的类,它有很多 ObjectsB,对象有一个 Id 来识别它们,但也有一种语言(枚举,但它实际上保存为和 INT,对于这种情况都无关紧要)。

public class ObjectA
{
       public int Id {get;set;}
       public Language Language {get;set;}
       ... // and a list of objectA properties

       public virtual ICollection<ObjectB> ObjectBs {get;set;}
}

public class ObjectB
{
       public int Id {get;set;}
       public Language Language {get;set;}
       ... // and a list of objectB properties

       public ObjectA TheObjectA {get;set;}
}

现在我学会了如何将它们都映射为主键,为此我使用了 fluent API。我知道您也可以使用 [Key] 和 [Column] 属性(我不使用):

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

现在我尝试了很多东西,但我似乎无法将它们相互连接起来。任何人都知道我该如何解决这个问题?

4

1 回答 1

2

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

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

(我相信你必须交换IdLanguage以下工作。)

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
于 2012-09-12T21:02:04.473 回答