繁体   English   中英

带1 .. *的实体框架关系0..1反向链接

[英]Entity Framework relationship 0..1 with 1..* back link

我的实体框架POCO类中有两个对象,分别是救生艇和瞄准

Sighting与Lifeboat有1 .. *的关系,这似乎很好(使用SightingLifeboats的链接表

我现在还需要回溯该关系,因此我需要从救生艇到瞄准的链接,该链接将为0 .. *

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

我的救生艇课:

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();
    }

}

这不是在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可以实时了解更改,而无需捕获对象的原始值,然后在保存时扫描更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM