[英]Quick fix for ViewModel using multiple Entity Framework contexts
當前正在使用MVVM模式在MVC應用程序上工作。 最初的編寫是為了使所有ViewModels都繼承自同一個BaseViewModel,后者創建了一個Entity Framework存儲庫,如下所示:
public abstract class BaseViewModel : INotifyPropertyChanged
{
private static MyRepository _rep;
protected static MyRepository rep
{
get
{
if (_rep == null)
_rep = new MyRepository();
return _rep;
}
}
}
我繼承的應用程序實際上沒有任何單元測試,因此我決定進行一些重構以使其更具可測試性。 因此,我在存儲庫上放置了一個接口,並為每個視圖模型提供了自己的副本,以便可以對其進行模擬以進行測試:
public class MyViewModel : BaseViewModel
{
private IMyRepository _rep;
public AvailabilityHistoryViewModel()
: this(new MyRepository())
{ }
public MyViewModel(IMyRepository rep)
{
_rep = rep;
DoStuff();
}
}
在大多數情況下都可以。 但是隨后,我遇到了一個先前可用的按鈕,該按鈕突然導致應用程序崩潰,並產生了可怕的“實體對象無法被IEntityChangeTracker的多個實例引用”錯誤。
事實證明,在應用程序的多個位置都使用了UserControl,它也繼承自BaseViewModel,因此具有自己的存儲庫副本。
public abstract class BaseTreeViewItem : BaseViewModel
{ }
當在父視圖模型中使用它並傳遞其屬性時,很有可能最終會產生一個EF對象,該EF對象是通過將UserControl存儲庫傳遞給ViewModel並與其存儲庫一起保存的-因為它們是不同的上下文,導致崩潰。
簡單的解決方法是簡單地撤消我的更改,並使使用此UserControl的ViewModel返回到使用BaseViewModel存儲庫。 但這很丑。 對此的正確解決方案是重新安排事情,以便UserControl沒有自己的上下文,這將花費我實際所花的時間。 還有另一種方法嗎?
我可能會錯過一些東西,但是在我看來,擁有單例存儲庫將解決您的問題。 您已經通過接口使用了它們,因此只需注入它們即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.