2016-03-15 92 views
1

在EF以前的版本,我可以使用下面的代碼來實現的標識關係:實體框架7:確定關係

public class Child 
{ 
    [Key, Column(Order = 1)] 
    public virtual int Id { get; set; } 

    [Key, Column(Order = 2)] 
    public virtual int ParentId { get; set; } 
    public virtual Parent Parent { get; set; } 
} 

它需要輕鬆地從集合中刪除一個孩子是這樣的:

var parent = _context.Parents.First(); 
var child = parent.Children.First(); 

parent.Children.Remove(child); 

_context.SaveChanges(); 

該方法在http://www.kianryan.co.uk/2013/03/orphaned-child/(方法#2)中描述。

但在這EF7代碼拋出時遷移創建例外:

異常在執行解析操作被拋出。有關詳細信息,請參閱 InnerException。 --->實體類型'子'具有用數據註釋定義的主鍵合成 。要設置複合主鍵 鍵,請使用流利的API。

我還試圖用FluentAPI如下面的代碼中How to define nested Identifying Relationships Entity Framework code first描述:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Parent>() 
      .HasMany(p => p.Children) 
      .WithOne(c => c.Parent); 

     modelBuilder.Entity<Child>() 
      .HasKey(c => new {c.Id, c.ParentId}); 

     base.OnModelCreating(modelBuilder); 
    } 

這種方法允許成功生成遷移,但是當我試圖從Children集合中刪除一個孩子,我有以下異常:

System.InvalidOperationException:實體類型 「父」與「子」之間的關聯已被切斷,但T的外鍵他的 關係不能設置爲空。如果刪除從屬實體 ,則將該關係設置爲使用級聯刪除。

但我不想使用級聯刪除,我想用識別關係!

請幫我理解我做錯了什麼。謝謝!

+0

要完全刪除了孩子?或者你想刪除只是親子關係? –

+0

@MihailStancescu,是的,我想刪除關係和孩子。 – hcp

+1

您應該配置級聯刪除,如錯誤消息所述。或者你必須手動移除這個你不想要的東西。 –

回答

2

使用級聯刪除上的,而不是因爲這是它的用於:

modelBuilder.Entity<Parent>() 
    .HasMany(p => p.Children) 
    .WithOne(c => c.Parent); 
    .WillCascadeOnDelete(true); 

https://msdn.microsoft.com/en-gb/data/jj591620.aspx

+0

您不必爲此打開級聯刪除。級聯刪除用於在關係的父母被刪除時刪除孩子*,而不是用於刪除孩子從集合中刪除時的情況 - 這就是設置標識關係應該用於的情況(即使用組合主鍵行號和外鍵),這就是它在EF 6中的工作方式。也許EF 7中的內容已經發生了變化,但如果這樣,這仍然不是一個好主意,因爲如果它創建的話,並不總是可以打開級聯刪除一個循環的事件鏈。 – Triynko