实体框架关系0.1与1.*反向链接

本文关键字:链接 关系 实体 框架 | 更新日期: 2023-09-27 18:03:31

我有两个对象在我的实体框架POCO类称为救生艇和Sighting

瞄准有1..*与救生艇的关系,这似乎工作得很好(与目击救生艇的链接表

)

我现在还需要反向引用该关系,所以我需要从救生艇到目击的链接,该链接将为0。*

我试过做相反的,并试图使一个虚拟,但这没有工作,也许我需要更流畅的编码?

My Lifeboat Class:

public class Lifeboat : EntityBase
{
    public Lifeboat()
    {
        Sightings = new List<Sighting>();
    }
    public string CurrentName { get; set; }
    //A Lifeboat Ownes 0:* Sightings
    public List<Sighting> Sightings { get; set; }
    //public virtual Sighting Sightings { get; set; }
    //Called from Context Class OnModelCreating
    public static void LifeboatEntityConfiguration(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Lifeboat>().HasMany(x => x.Sightings).WithMany();
    }
}

和瞄准类

public class Sighting : EntityBase
{
    public Sighting()
    {
        Lifeboats = new List<Lifeboat>();
        TimeSeen = DateTime.Now.Date;
    }
    public string Location { get; set; }
    //A Sighting has 1..* Lifeboats (Not Owned)
    public List<Lifeboat> Lifeboats { get; set; }
    //public virtual Lifeboat Lifeboat { get; set; }
    public static void SightingEntityConfiguration(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Sighting>().HasMany(x => x.Lifeboats).WithMany();
    }

}

实体框架关系0.1与1.*反向链接

这不是配置LifeboatSighting之间多对多关系的正确方式。如果您删除您已经拥有的Fluent Api配置,默认情况下,EF将创建第三个连接表SightingLifeboats,它将由两个表的PK组成。这是因为在每个实体中都有一个集合导航属性。但是你可以使用Fluent Api显式地配置这种关系:

 modelBuilder.Entity<LifeBoat>()
             .HasMany<Sighting >(l => l.Sightings)
             .WithMany(s => s.LifeBoats)
             .Map(cs =>
                      {
                         cs.MapLeftKey("LifeBoatRefId");
                         cs.MapRightKey("SightingId");
                         cs.ToTable("SightingLifeboats");
                      });

这样,您可以更改连接表的名称并指定FK属性名称,以备需要更改时使用。

另一件事,我建议将您的集合属性更改为virtual。如果您将所有属性更改为virtual,那么EF将在运行时生成源自POCO类的代理类,这些代理允许EF实时发现更改,而不必捕获对象的原始值,然后在保存时扫描更改。