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();
如果有机会,我会发布它是否有效
你的逻辑被颠倒了。您现在写的是每个成员都有一个地址,这导致一个地址可以存在多个成员的事实,这意味着在层次结构表中,地址位于成员之上。删除子项不会导致删除父项。
尝试删除地址,如果您想测试我刚刚写的内容,您的会员将消失。
要使逻辑正常工作,您需要编写:
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();
}
这样做可以使级联删除正常工作,以便在删除成员时删除地址。