我有以下问题(高级):
我的 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 对象)。概括:
这导致了一个问题,即简单的用例(例如“保存数据集 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/