在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的外鍵他的 關係不能設置爲空。如果刪除從屬實體 ,則將該關係設置爲使用級聯刪除。
但我不想使用級聯刪除,我想用識別關係!
請幫我理解我做錯了什麼。謝謝!
要完全刪除了孩子?或者你想刪除只是親子關係? –
@MihailStancescu,是的,我想刪除關係和孩子。 – hcp
您應該配置級聯刪除,如錯誤消息所述。或者你必須手動移除這個你不想要的東西。 –