0

我有一个地址在一对一的风格,其中一个地址行只能属于一个成员的成员模型。我试图找出如何定义这个,所以会员拥有地址和地址级联删除,当我删除一个成员。EF代码第一个模型定义一对一映射级联删除

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 '*'. 

发现这个从docs - 一对一只有一个导航属性

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

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

我会后,如果它的工作原理,当我得到一个机会

回答

0

我尝试了一些不同的事情,但是这是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(); 
} 

这样做可以使级联删除正常工作,所以当该成员将被删除的地址将被删除。

0

你的逻辑被颠倒过来。你现在写的是,每个成员都有一个地址,这导致了一个事实,即一个地址可以出现在几个成员上,这意味着在层次结构表中,地址在成员之上。删除孩子不会导致删除父母。

如果您想测试我刚刚写的内容,请尝试删除该地址,并且您的成员将不复存在。

对于你的逻辑工作,你需要写:

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;} 
} 
+0

难道不会创建多对一的关系吗?一个成员可能有许多地址实体?我明白我是怎么犯了一个错误的,尽管我应该说一个地址只能有一个成员 – Neil

+0

那么如果地址只能有一个成员,那么你就有1对1的关系。我现在也粘贴了一个代码。 –