我可以告诉linq 2 SQL不更新某些列后附件或使用UpdateModel

本文关键字:UpdateModel linq SQL 更新 我可以 | 更新日期: 2023-09-27 18:17:29

假设我有以下情况:服务中的更新方法接受一个模型(即将更新的模型)作为输入参数。模型可以是未附加的(在这种情况下,在提交更改之前调用attach方法),也可以是附加的(在这种情况下,我们只提交更改)。编辑动作在我的服务中调用这个更新方法。现在让我们假设我不能更改这些操作中的代码(生成要更新的模型的代码)。我是否仍然可以以某种方式阻止某些列从更新方法中更新。请注意,我可能希望使用linq to SQL设置这些列,但只能在插入方法期间设置。

我很确定我在这里尝试了一些非常规的东西,但它可能有助于我编写一些易于重用的代码。如果做不到,我会用不同的方法来解决,但尝试一些新的东西总是有益的。

我可以告诉linq 2 SQL不更新某些列后附件或使用UpdateModel

Attach方法确实提供了一个覆盖来接受修改后的和原始的实体。在数据上下文上附加修改后的实体

当使用此方法时,内部更改跟踪器将找出哪些列已被更新,并且只更新数据源上已更改的列,而不是更新所有列。

或者,如果你想要更明确地控制哪些属性被更新,你可以在原始状态下将你的实体重新附加为未修改的:在数据上下文上附加修改/未修改的实体

这将把内部更改跟踪器连接到实体上的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();
        }
    }

这些方法的缺陷意味着你必须在你的模型中维护原始的和修改过的实体,但是可以在你的实体被加载时进行设置——一个简单的对象的浅拷贝应该通过在每个实体的部分类中派生ICloneable来实现。