2014-01-10 65 views
1

我開始使用EF4並努力瞭解如何正確添加對象。 這是一個多層應用程序,我有一個數據層,它返回我的實體。然後,我在業務層中改變該實體,並通過導航將對象添加到其鏈接的對象。但是,我似乎遇到了一個問題,當我嘗試更新實體時,添加了相關對象。通過導航添加項目並將其存儲在新的上下文中

所以我有這樣的事情:

FirstTypeOfObject:身份證,SomeProperty SecondTypeOfObject:身份證,SomeProperty,FKToFirstTypeOfObject ThirdTypeOfObject:身份證,SomeProperty,FKToSecondTypeOfObject

所以我有一個1到多對多的關係。

現在在我的DAL我檢索FirstTypeOfObject:

using(var context = new ObjectContext()) 
{ 
    var first = context.FirstTypeOfObjects 
    .Single(i => i.id = "something") 
    .Include(o => o.SecondTypeOfObjects.Select(s => s.ThirdKindOfObjects))) 
    return first; 
} 

然後我在我的businesslayer添加到該對象:

ThirdKindOfObject t = new ThirdKindOfObject(); 
t.SomeProperty = "test"; 
t.Id = Guid.NewGuid(); 
first.SecondTypeOfObjects.FirstOrDefault().Add(t); 

我然後調用一個方法在我的DAL:

public void UpdateObject(FirstTypeOfObject myObject) 
{ 
    using(var context = new ObjectContext()) 
    { 
    context.FirstTypeOfObject.Attach(myObject) 
    context.ObjectStateManager.ChangeObjectState(myObject, EntityState.Modified); 
    context.SaveChanges() 
    } 
} 

但是,當我更新的項目,我收到一個錯誤:

An object with a temporary EntityKey value cannot be attached to an object context 

我不想每次需要創建ThirdTypeOfObject時都去數據庫,因爲它可能是100個對象。另外我想通過實體模型進行修改,我的DAL不知道修改了什麼。我不希望我的DAL知道在業務層中寫入的任何類。

我這樣做,因爲它不是打算?我只是錯過了什麼?

回答

1

Also I would like to pass the entity model around for modification and my DAL doesn't know what have been modified. I don't want my DAL to know of any classes written in the business layer.

Am I doing this as it wasn't intended? Am I just missing out on something?

代替微管理數據庫的上下文,即,打開和在DAL層的每一個方法閉新的上下文時,應使用每HTTP請求一個數據庫上下文。數據庫上下文會跟蹤給定HTTP請求中的所有更改。 ObjectContext實際上是Unit of Work的一個實現,使用dependency injection container可以將工作單元的生命週期設置爲HTTP請求的範圍。這可以消除不連貫的實體,這可能會讓你很難找到答案。

根據您的體系結構,您希望將更改保存到業務層上方的上下文中。

+0

謝謝。這對我有效。使用AutoFac DI,我現在通過HttpRequest創建一個objectContext,這對我很有用。我的DAL現在返回實體。然後通過更高層進行修改,然後通過調用DAL中的方法保存更改,然後調用.SaveChanges() –

相關問題