http://weblogs.asp.net/zeeshanhirani/archive/2010/07/23/removing-entity-from-a-related-collection.aspx解釋到底發生了什麼,以你的內心。
假設你有一個一流的設計是這樣的:
![sample class design](https://i.stack.imgur.com/IuTof.png)
實體框架將生成所需的外鍵列,並添加NOT NULL
約束他們,因爲所有的食譜總是以完全相同相關一個ControlUnit。
所以在運行時,你將有類似於以下佈局對象:
![object diagram at runtime](https://i.stack.imgur.com/BCB7S.png)
現在你的代碼進場,並刪除了配方之間的關係的對象和他們的控制單元:
![objects with deleted relationships](https://i.stack.imgur.com/bEDR0.png)
試圖保存在這個時候,數據庫沒有一個ControlUnit ID放入外鍵NOT NULL
列。當前對象狀態違反了上面的類圖,並且無法將其保存到假設每個配方都與一個ControlUnit關聯的情況下生成的數據庫佈局。這就是數據庫拒絕保存更改並看到異常的原因。
這也解釋了爲什麼它在解除刪除實體的行時註釋掉:實體從數據庫及其關係中刪除,因此沒有違反約束,因此沒有例外。
「但我的關係設置ON DELETE CASCADE
...」
是的,但這只是引發了對象的刪除,不上關係的缺失。隨着ON DELETE CASCADE
集,這應該工作:
controlUnitRepository.DeleteObject(_controlUnit);
// deletes the ControlUnit and all associated Recipe entities
如果要觸發配方實體刪除它們與控制單元關係的缺失,你們的關係不應該是簡單關聯,而是一個組成:
![updated class diagram with composition](https://i.stack.imgur.com/6TJEA.png)
EF本身不支持此操作,但可以使用標識關係來模擬行爲。一旦實體處於與父實體的識別關係並且該關係被移除,該實體也被移除。看起來這是你一開始的意圖。有關確定關係的更多信息,請參閱Implementing identifying relationships with EF4,其中我實施了與EF4的識別關係並已鏈接到更多閱讀材料。
public static void Delete<T>(this EntityCollection<T> collection, T entityToDelete) where T : EntityObject, IEntityWithRelationships
{
RelationshipManager relationshipManager = entityToDelete.RelationshipManager;
IRelatedEnd relatedEnd = relationshipManager.GetAllRelatedEnds().FirstOrDefault();
if (relatedEnd == null)
{
throw new Exception("No relationships found for the entity to delete. Entity must have at least one relationship.");
}
var query = relatedEnd.CreateSourceQuery() as ObjectQuery;
if (query == null)
{
throw new Exception("The entity to delete is detached. Entity must be attached to an ObjectContext.");
}
query.Context.DeleteObject(entityToDelete);
collection.Remove(entityToDelete);
}
所以我然後刪除實體像Order.Products.Delete(prod)
:
今天我有同樣的問題,我相信這是在實體框架設計缺陷。 SQL Server中的表之間的關係聲明「級聯刪除孤兒」,因此應該可以工作。它在NHibernate中的工作方式。幸運的是,您可以按照GraemeMiller的回答和相關問題開展工作。 – 2013-04-22 10:38:04