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的關係。我現在也粘貼了一個代碼。 –