C# 实体框架6带导航和级联删除的一对一
我不确定我想做的是否可行,所以这里有我想要的描述 首先,当我说nvigation时,我想在查询时在代码中执行以下操作:C# 实体框架6带导航和级联删除的一对一,c#,entity-framework,one-to-one,cascading-deletes,navigation-properties,C#,Entity Framework,One To One,Cascading Deletes,Navigation Properties,我不确定我想做的是否可行,所以这里有我想要的描述 首先,当我说nvigation时,我想在查询时在代码中执行以下操作: using (var db = new DataContext(connString)) { var person = db.People.Include("Address").First(); // address to be included //other
using (var db = new DataContext(connString))
{
var person = db.People.Include("Address").First(); // address to be included
//other logic
}
所以我有两个实体(个人和地址)
- 个人需要导航属性来寻址
- 一个人只能有一个地址
- 个人地址是必需的
- 地址可以有多个人(妈妈和女儿有相同的地址) (例如地址)
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int AddressId { get; set; } // needed for nav?
public virtual Address Address { get; set; } // nav property
}
public class Address
{
public int Id { get; set; }
public string AddressLines1 { get; set; }
public string AddressLines2 { get; set; }
public string AddressLines3 { get; set; }
public string PostCode { get; set; }
public virtual Person Person { get; set; } // needed for one to one?
}
好的,这里是流畅的api代码,注意:一个用于一对一工作,一个用于导航-我没有一个用于两者,但就我所见,上面的实体是为两者设置的
一对一级联删除(但无导航属性)
modelBuilder.Entity()
.HasRequired(s=>s.Address)
.具有所需负责人(ad=>ad.Person)
.WillCascadeOnDelete(真);
定义导航但缺少级联删除功能的生成器(已测试且未级联删除)
modelBuilder.Entity()
.HasRequired(t=>t.Address)
.有很多
.HasForeignKey(t=>t.AddressId)
.WillCascadeOnDelete(真);
提前感谢。“地址可以有多人”表示您正在处理一对多关系,而不是一对一(一个地址可以有多人)。这也意味着您应该将地址实体中的Person引用更改为
公共虚拟ICollection Persons
。另外Person。导航不需要AddressId
,因为它将由实体框架自动生成。我无法看到林,因为树挡住了:(非常感谢!非常感谢您的情况也应该在删除上起作用。当您删除一个地址时,您将删除所有相关人员。“地址可以有多人”表示您正在处理一对多关系,而不是一对一(一个地址可以有多人)。这也意味着您应该将地址实体中的Person引用更改为公共虚拟ICollection Persons
。另外Person。导航不需要AddressId
,因为它将由实体框架自动生成。我无法看到林,因为树挡住了:(非常感谢!非常感谢您的情况也应该在删除上起作用。当您删除地址时,您将删除所有相关人员
modelBuilder.Entity<Person>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(ad => ad.Person)
.WillCascadeOnDelete(true);
modelBuilder.Entity<Person>()
.HasRequired(t => t.Address)
.WithMany()
.HasForeignKey(t => t.AddressId)
.WillCascadeOnDelete(true);