簡體   English   中英

使用多個實體框架上下文的ViewModel快速修復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM