EF 代码优先 使用级联删除进行一对一映射的模型定义

本文关键字:一对一 映射 定义 模型 删除 代码 级联 EF | 更新日期: 2023-09-27 18:31:26

我有一个成员模型,其地址采用一对一样式,其中地址行只能属于一个成员。 我正在尝试弄清楚如何定义它,以便会员拥有地址,当我删除会员时,地址会级联删除。

public class Member
{
    [Key]
    public int Id { get; set; }
    [Required]
    [ForeignKey("Address")]
    public int AddressId { get; set; }
    public virtual Address Address { get; set; }
}

我也有地址

public class Address : IEntity
{
    [Key]
    public int Id { get; set; }
    ....
}

我已经尝试了以下方法来获取要级联删除的地址

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Member>()
        .HasRequired(m => m.Address)
        .WithRequiredDependent()
        .WillCascadeOnDelete(true);
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Member>()
        .HasRequired(m => m.Address)
        .WithRequiredPrinciple()
        .WillCascadeOnDelete(true);
}

有人可以在这里帮忙让我走上正轨吗? 迁移失败,并显示以下行。

System.Data.Entity.ModelConfiguration.ModelValidationException: One 
or more validation errors were detected during model generation:
System.Data.Entity.Edm.EdmAssociationEnd: : Multiplicity is not valid 
in Role 'Member_Address_Source' in relationship 'Member_Address'. Because the
Dependent Role properties are not the key properties, the upper bound of the 
multiplicity of the Dependent Role must be '*'.

从文档中找到这个 - 只有一个导航属性的一对一

 modelBuilder.Entity<OfficeAssignment>()
    .HasKey(t => t.InstructorID);
 modelBuilder.Entity<Instructor>()
     .HasRequired(t => t.OfficeAssignment)
     .WithRequiredPrincipal();

如果有机会,我会发布它是否有效

EF 代码优先 使用级联删除进行一对一映射的模型定义

你的逻辑被颠倒了。您现在写的是每个成员都有一个地址,这导致一个地址可以存在多个成员的事实,这意味着在层次结构表中,地址位于成员之上。删除子项不会导致删除父项。

尝试删除地址,如果您想测试我刚刚写的内容,您的会员将消失。

要使逻辑正常工作,您需要编写:

public class Member
{
    [Key]
    public int Id { get; set; }
...
}
public class Address : IEntity
{
    [Key]
    public int Id { get; set; }
    public int MemberId {get;set;}
    public virtual Member Member {get;set;}
    ....
}

如果打开级联删除并删除成员,地址也将被删除。

编辑:

如果您正在寻找 1 对 1 的关系,它是这样的:

public class Member
{
[Key]
public int Id {get;set;}
...
public virtual Address Address {get;set;}
}
public class Address
{
[ForeignKey("Member")]
public int Id {get;set;}
...
public virtual Member Member {get;set;}
}

我尝试了一些不同的东西,但这是 EF 创建一对一映射的方式,在关系的一侧只有一个导航。

public class Member
{
    [Key]
    public int Id { get; set; }
    public virtual Address Address { get; set; }
}
public class Address
{
    [Key]
    public int MemberId {get;set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Address>()
        .HasKey(t => t.MemberID);
    modelBuilder
        .Entity<Member>()
        .HasRequired(t => t.Address)
        .WithRequiredPrincipal();
}

这样做可以使级联删除正常工作,以便在删除成员时删除地址。