2013-07-17 73 views
0

我有一個實體爲許多不同的實體定義屬性。EF多個外鍵只需要1個

例如。

class user{ 
ICollection<PropertyEntity> properties {get;set;} 
} 

class company{ 
ICollection<PropertyEntity> properties {get;set;} 
} 

當我從用戶或公司刪除一個PropertyEntity。

myUser.properties.Remove(someProperty); 

PropertyEntity不會被刪除,它只是將其外鍵設置爲null。

我知道我可以使用[Key]註釋來定義外鍵。但據推測,這將需要兩個鍵而不是?

如何獲取EF來構建該關係,以便用戶或公司可以擁有多個PropertyEntity。但是如果沒有用戶或公司,PropertyEntity會被刪除嗎?

+1

你真的在「刪除」PropertyEntity或者只是從集合中刪除它嗎? –

+0

所以你想級聯刪除?,你是否定義了與流利API的關係? – SOfanatic

+0

這不是級聯刪除,因爲父實體沒有被刪除。我正在做的是從集合中刪除它。但它不會從數據庫中刪除。 我在建議如何用流利的API來定義它。 –

回答

0

如果關係是可選的,則無法定義關係,因此從導航集合中刪除子項也會將其從數據庫中刪除。

你必須要麼調用DbSet<T>.Remove爲孩子...

myUser.properties.Remove(someProperty); 
if (!someProperty.CompanyId.HasValue) 
    context.PropertyEntities.Remove(someProperty); 

...(這也將自動從集合中刪除子),或者你可以嘗試刪除「孤立」的孩子覆蓋SaveChanges更改提交前:

public override int SaveChanges() 
{ 
    PropertyEntities.Local 
     .Where(p => !p.UserId.HasValue && !p.CompanyId.HasValue) 
     .ToList() 
     .ForEach(p => PropertyEntities.Remove(p)); 

    return base.SaveChanges(); 
} 

這種方法在更多的細節上Arthur Vickers' blog解釋。

設置一個identifying relationship(這將支持從導航集合中刪除數據庫時從數據庫中刪除)確實只有在需要關係時纔可能,因此它不適用於您。

相關問題