2011-03-09 243 views
0

如何更新EF 4中的實體?實體框架更新?

例如:

1)使用AutoMapper以產生從服務層類別實體CategoryEditModel。

2)將EditModel傳遞給View。大!!

3)回發EditModel,使用AutoMapper獲取CategoryEditModel - > Category。

4)取出該類別並將其傳遞給服務層,該服務層將其傳遞給存儲庫,該存儲庫反過來執行ObjectSet.Attach(TEntity)。

告訴我ObjectStateManager有另一個具有相同鍵的對象嗎?

我正在使用Ninject向服務和UnitOfWork注入控制器,使用存儲庫的服務和使用UnitOfWork的存儲庫。 UnitOfWork的範圍是每個請求。

看來有什麼東西被緩存在緩存裏呢?

我是否必須在UOW上調用處置或將Ninject處理?它確實實現了IDisposable,並且在處理中處理了上下文。

+0

您是否根據HTTP請求確定了您的上下文範圍?你是否創建了一個IDatabaseFactory實現來爲你的UoW和Repositories獲取DatabaseContext? – Paul 2011-03-09 03:49:56

+0

@Paul - 我在映射結尾處有.InRequest。 IDatabaseFactory?我不知道那是什麼。 – Sam 2011-03-09 04:38:35

+0

通常你會用一個方法創建一個IDatabaseFactory,MyContext Get();您的IRepository 和IUnitOfWork將使用IDatabaseFactory Get方法獲取當前上下文。這個類還將實現IDisposable。看看這裏的示例實現:http://stackoverflow.com/questions/4442828/entity-framework-4-ctp-4-ctp-5-generic-repository-pattern-and-unit-testable/4458250#4458250 – Paul 2011-03-09 04:54:10

回答

0

實體上下文緩存對象。通常認爲保持特定背景的壽命很短是明智的。我這樣做是利用每個庫方法中的一個工廠:

public SomeObject GetSomeObjectById(int id) 
{ 
    using (var context = _contextFactory.Get()) 
    { 
     return context.SomeObjects.SelectSingle(o => o.Id == id); 
    } 
} 

如果你很確定你想跟着一個上下文每個請求的模式,你需要加載所需的實體(如果您使用context.GetObjectByKey應該是免費的,因爲在這種情況下它聽起來像緩存),請更改對象上的值,然後保存更改。

+0

如何處理在一個控制器操作中使用多個服務/存儲庫並使它們都在相同的上下文中運行? – Sam 2011-03-09 00:56:54

+0

@Sam Striano:他們並非都在相同的背景下工作。從代碼中可以看到,每次調用存儲庫方法時,我都會創建並處理一個上下文。 – StriplingWarrior 2011-03-09 16:47:01

0

我認爲你應該只使用一個實體框架會話對象,而沒有存儲庫。看看這個帖子:Question about Interfaces and DI?,讓我知道你是否有問題。這是代碼優先,它對我來說非常合適。

希望它可以幫助你!

+0

所以沒有存儲庫或服務層?您的控制器是否注入了其中一項請求? – Sam 2011-03-09 02:54:36

+0

不僅一個會話對象女巫是強類型的,你可以看看codeplex上的MVC初學者網站:http://mvcstarter.codeplex.com/它有助於開始正確的方式。我的控制器注入一個ISession對象,然後我可以用LINQ來做所有我想要的數據庫,例如:_session .Where(x => x.Name ==「Vinny」),執行更改並調用_session.CommitChanges( )完成後。 – VinnyG 2011-03-09 03:11:43