[英]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();
}
}
这不是在Lifeboat
和Sighting
之间配置多对多关系的正确方法。 如果删除现有的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.