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

时间:2015-07-19 16:47:35

标签: c# entity-framework ef-fluent-api

我的Entity Framework POCO类中有两个对象,名为Lifeboat and Sighting

瞄准与救生艇有1 ... *关系,这似乎工作正常(有一个SightingLifeboats链接表

我现在还需要重新引用这种关系,所以我需要一个从救生艇到瞄准的链接,它将是0 .. *

我试过反过来尝试制作一个虚拟但是这个没有用,也许我需要更流畅的编码?

我的救生艇课程:

<form action="action_page.php">
<fieldset>
<legend>Personal information:</legend>
First name:<br>
<input type="text" name="firstname" value="Mickey">
<br>
Last name:<br>
<input type="text" name="lastname" value="Mouse">
<br><br>
</fieldset>
<fieldset>
<legend>Course:</legend>
<input type="checkbox" name="french" value="French"> French
<br>
<input type="checkbox" name="german" value="German"> German 
<br>
<input type="checkbox" name="spanish" value="Spanish"> Spanish 
</fieldset>
<input type="submit" value="Submit">
</form>

瞄准课

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

}

1 个答案:

答案 0 :(得分:2)

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