实体框架关系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();
}
}
这不是配置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实时发现更改,而不必捕获对象的原始值,然后在保存时扫描更改。