c# - ViewModel 直接绑定(bind)到 Entity Framework 模型的副作用

标签 c# wpf entity-framework mvvm unit-of-work

我有以下问题(高级):
我的 ViewModel 有一些可以由用户编辑的属性(在我的 View 中)。大多数属性直接绑定(bind)到我的 Entity Framework 模型。在很多情况下,这会导致我必须分离我的模型 e。 G。将其保存到数据库后(如果我不这样做并且用户在 View 中进行了一些更改,这些更改将在下一次调用时自动反射(reflect) SaveChanges())。不幸的是,分离它会导致所有虚拟属性都变为空的问题。所以我必须确保在分离对象之前创建正确的“副本”。这会导致很多副作用。

为了让您更好地理解我的问题,一些代码示例(当然是简化的):

我的模型:

public class Child
{
    public int SomeNumber { get; set; }
    public string SomeText { get; set; }
    public int MotherId { get; set; }
    public virtual Mother Mother { get; set; }
    public virtual ICollection<Sibling> Siblings { get; set; }
}

我的 View 模型:
public class ChildViewModel : ViewModel
{
    private IGenericRepository<Child> _repository;

    public string SomeText
    {
        get { return MyModel.SomeText; }
        set
        {
            MyModel.SomeText = value;
            RaisePropertyChanged("SomeText");
        }
    }

    public Mother Mother
    {
        get { return MyModel.Mother; }
        set
        {
            MyModel.Mother = value;
            RaisePropertyChanged("Mother");
        }
    }

    public void Save()
    {
        if (MyModel.Id == 0)
        {
            Insert();
        }
        else
        {                
            Update();
        }            
        UnitOfWork.Save();
        _repository.Detach(PrimaryModel);
    }
}

如您所见,ViewModel 的属性直接绑定(bind)到我的 EF 模型。在保存中,我必须在保存后分离。如果我不这样做,则会导致以下问题:用户更改 SomeText在 View 中但不保存。现在UnitOfWork.Save()叫做。 SomeText 的更改值被意外保存。这样做的副作用是 Mother 属性现在将为空。

为了避免这种情况,我尝试创建对象的“真实”副本。因此,每个模型都必须实现一种方法来复制其值。在谈论复杂对象时,这变得困难且容易出错。尝试保存“复制”对象时,我会遇到更多副作用,例如错误 Attaching an entity of type ... failed because another entity of the same type already has the same primary key value. (尤其是“复制” 1:many 和 many:many 对象)。

概括:
  • 通过 ViewModel 直接将 Model 绑定(bind)到 View ...
  • ...在不分离时可能会导致一些副作用。
  • 分离模型会导致虚拟属性变为空。
  • 为了避免这种情况,可以在分离之前创建对象的副本。
  • 当复制的对象非常复杂(多个 1:many 和 many:many 关系)时,很难保存复制的对象。

  • 这导致了一个问题,即简单的用例(例如“保存数据集 xyz”)——至少它们应该是简单的 imo——花费大量时间并且代码变得越来越复杂。

    我怎样才能避免这些陷阱?

    最佳答案

    解决方法很简单,不要在您的 View 模型中创建引用您的模型的额外属性。相反,直接绑定(bind)模型 .

    这是一个例子:

    public string SomeText
    {
        get { return MyModel.SomeText; }
        set
        {
            MyModel.SomeText = value;
            RaisePropertyChanged("SomeText");
        }
    }
    

    在上面的代码中,您在 View 模型中创建了一个附加属性,即 不需要这样做 .我猜你是这样绑定(bind)它的:
    <TextBox Text="{Binding SomeText}" ... />
    

    您应该绑定(bind)到 ,而不是创建这个额外的属性。型号 .像这样:
    <TextBox Text="{Binding MyModel.SomeText}" ... />
    

    现在,您不必再担心分离模型了。

    关于c# - ViewModel 直接绑定(bind)到 Entity Framework 模型的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31289979/

    相关文章:

    c# - Entity Framework 连接到 Oracle : ODP for . NET "does not support time"

    c# - 选择最大值,但仅限于使用 LINQ to Entities 的数值

    entity-framework - Entity Framework 中的内容国际化

    javascript - C# 内联 lambda 表达式

    c# - 如何激发对共享资源的同时访问?

    c# - WPF面板旋转?

    wpf - 带有MS SQL Server的通用Windows应用

    c# - 将组合框绑定(bind)到模型/ View 模型

    C# 使用 Linq 加入 3 个列表

    c# - 如何通知正在运行的线程应用程序将在 .net 中关闭?