实体框架连接(ISH)表映射代码第一

时间:2020-02-04 22:18:05

标签: c# entity-framework

一个人如何用EF v6.2中的值映射一个联结表?

假设您有一个名为“ Item1”,“ Item2”的实体,并且它们的另一个实体已映射:

public class Item1
{
    [Key]
    public long Id { get; set; }

    public virtual ICollection<MapItem> { get; set; }
}

public class Item2
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<MapItem> { get; set; }
}

public class MapItem
{
    public long Item1ID {get; set;} //PK, FK
    public int Item2ID {get; set;} //PK, FK

    public decimal Value {get; set;}
    public string Name {get; set;}

    public virtual Item1 {get; set;}
    public virtual Item2 {get; set;}
}

EDMX自动生成此代码,但是我将如何使用代码优先/ FluentAPI生成此代码以构建MapItem实体的可访问集合?

我尝试更新映射的实体,以在[Key(Order = 1)]的PK和FK值上使用[Key(Order = 2)]MapItem

考虑到这不是一个由2个实体组成的真正联结表,但它也具有价值,这似乎是一种奇怪的情况。

1 个答案:

答案 0 :(得分:0)

在这里,我可以使用FluentAPI来解决它。

在这里我修改了实体类:

public class MapItem
{
    [Key(Order = 1)]
    public long Item1ID {get; set;} //PK, FK

    [Key(Order = 2)]
    public int Item2ID {get; set;} //PK, FK

    public decimal Value {get; set;}
    public string Name {get; set;}

    public virtual Item1 {get; set;}
    public virtual Item2 {get; set;}
}

然后在关系生成器中:

 modelBuilder.Entity<MapItem>().HasKey(q => new
 {
        q.Item1ID, q.Item2ID
 });
​
 modelBuilder.Entity<MapItem>().HasRequired(q => q.Item1).WithMany(q => q.MapItem).HasForeignKey(q => q.Item1ID);
 modelBuilder.Entity<MapItem>().HasRequired(q => q.Item2).WithMany(q => q.MapItem).HasForeignKey(q => q.Item2ID);

关键部分是正确映射实体的“ HasKey”方法。