1

我試圖簡化我的代碼,並將一些核心邏輯移動到實體框架實體本身(看起來像這就是爲什麼我們有實體模型業務邏輯)。目前實體幾乎只是一堆屬性和集合。從EF4實體方法中刪除收集實體

我正在尋找具有從集合中刪除項目並將其添加到實體上的另一個集合的實體上的函數。

現在添加到其他收藏功能完美的作品。然而,刪除 - 從集合中刪除項目,但它不會刪除。

我得到:

操作失敗:關係不能被改變,因爲一個或多個外鍵的屬性是不可爲空。

據我所知,這是因爲從集合中刪除並不實際標記爲刪除,並且當上下文保存更改發生時,它被關鍵打亂,但未標記爲刪除。因爲我不在存儲庫中,並且無法訪問其中的上下文。我該如何讓上下文知道這個項目需要刪除?

我以爲我應該確保域實體封裝適當的業務邏輯。這只是做錯了什麼?我怎樣才能解決這個問題?我應該繞過這個嗎?

如果我使用的擴展方法:

public static ObjectContext GetContext(this IEntityWithRelationships entity) 
{ 
    if (entity == null) 
     throw new ArgumentNullException("entity"); 

    var relationshipManager = entity.RelationshipManager; 

    var relatedEnd = relationshipManager.GetAllRelatedEnds() 
             .FirstOrDefault(); 

    if (relatedEnd == null) 
     throw new Exception("No relationships found"); 

    var query = relatedEnd.CreateSourceQuery() as ObjectQuery; 

    if (query == null) 
     throw new Exception("The Entity is Detached"); 

    return query.Context; 
} 

我可以在實體中訪問上下文是這樣的:

var context = this.GetContext() as Entities; 
context.events.DeleteObject(event); 

這似乎可怕,但沒有工作。當然,這樣做不可能是正確的方式嗎?

+1

追求領域驅動的設計是一件好事(+1),但你很混淆DDD和數據層的責任。你的領域類應該忘記持久性邏輯(當然,EF模型 - 首先它們不是,但我們可以把它留在隱藏的範圍之內)。因此,如果只是在域級別添加和刪除對象不起作用,我會爲這種邏輯創建一個持久感知服務。 – 2012-03-07 19:59:43

+0

是的,我通常不會在這種情況下結束。插入和更新由存儲庫處理。然而,我的一個領域概念似乎需要從集合中移除當前事件並將其移至另一個集合。我想模擬清晰時事的概念。 – GraemeMiller 2012-03-07 20:13:17

+1

如果您更改活動的父項,該怎麼辦?無論如何,只要涉及到刪除標記,並且肯定需要對象上下文時,我會將其留給服務。 – 2012-03-07 20:39:01

回答