C# 实体框架6带导航和级联删除的一对一

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

我不确定我想做的是否可行,所以这里有我想要的描述

首先,当我说nvigation时,我想在查询时在代码中执行以下操作:

            using (var db = new DataContext(connString))
            {
                 var person = db.People.Include("Address").First(); // address to be included

                 //other logic                                         
            }
所以我有两个实体(个人和地址)

  • 个人需要导航属性来寻址

  • 一个人只能有一个地址

  • 个人地址是必需的


  • 地址可以有多个人(妈妈和女儿有相同的地址) (例如地址)

所以我有两个人都有相同的地址。如果我删除了Person 1,则该地址需要保留,因为它仍然通过Person 2链接。如果我删除了Person2,那么地址应该被删除(级联删除)

所以我想我的问题是‘这可能吗?如果可能,怎么可能?’

我可以选择其中之一,但不能同时选择两者:(

如果有任何帮助,我们将不胜感激。另外,这里是我为演示/测试而创建的简单对象的代码

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