假设我有以下情况,我服务中的更新方法接受一个模型(即将要更新的模型)作为输入参数。模型可以不附加(在这种情况下,在提交更改之前调用attach方法)或附加(在这种情况下我们只提交更改)。编辑操作只需在我的服务中调用此更新方法。现在让我们假设我无法更改这些操作中的代码(生成要更新的模型的代码)。我还能以某种方式阻止某些列从更新方法中更新。请注意,我可能希望使用linq to SQL设置这些列,但仅限于插入方法。
我很确定我在这里尝试非传统的东西,但它可能有助于我编写一些易于重用的代码。如果无法做到,那么我将以不同的方式解决它,但尝试新的东西永远不会伤害。
答案 0 :(得分:0)
Attach
方法确实提供了覆盖以接受修改后的原始实体。
Attach Modified Entity on Data Context
使用此功能时,内部更改跟踪器将确定哪些列已更新,并且只更新已更改的数据源上的那些列,而不是更新所有列。
或者,如果您希望更明确地控制更新哪些属性,则可以将实体重新挂接为未修改的原始状态: Attach Modified/Unmodified Entity on Data Context
这会将内部更改跟踪器连接到实体上的PropertyChanging事件,以便可以跟踪它。然后,您只需在服务的Update
方法中更改该实体的属性值。
void Update(MyModel model)
{
using (MyContext ctx = new MyContext())
{
ctx.DeferredLoadingEnabled = false;
ctx.MyEntities.Attach(model.OriginalEntity);
model.OriginalEntity.Value = model.ModifiedEntity.Value;
ctx.SubmitChanges();
}
}
这些方法的缺陷意味着您必须在模型中维护原始实体和修改后的实体,但是可以在加载实体时进行设置 - 对象的简单浅层副本应该通过从{{1}派生来实现在每个实体的部分类中。