【问题标题】:Validate Linq2Sql before SubmitChanges()在 SubmitChanges() 之前验证 Linq2Sql
【发布时间】:2009-07-31 14:07:10
【问题描述】:

谁能告诉我是否/如何在调用 SubmitChanges() 之前验证 Linq2Sql 中数据上下文中的更改。我的情况是我创建一个上下文,执行多个操作并在其他处理任务旁边添加许多插入,然后在提交失败时回滚。

我更愿意做的是在某些任务完成后进行某种“Validate()”调用,以便我可以在提交整个作业之前处理它。

【问题讨论】:

    标签: c# .net linq linq-to-sql validation


    【解决方案1】:

    要获取数据上下文中的所有更改,您可以调用

    ChangeSet changes = dataContext.GetChangeSet();
    
    // An IList<Object>
    changes.Deletes;
    changes.Inserts;
    changes.Updates;
    

    我所拥有的是每个值对象都有一个验证方法。我使用属性来定义不同类型的验证。我手动执行此操作的原因是因为我在数据库和代码中有一个可能是 int 的数字,如果我保存年龄,则 1002 的值可能无效。所以我可以给出一个值的范围等等。。 .

    如果您的每个值对象都继承自基础对象,则迭代它们会更容易。假设您的基类上有一个 Validate 方法。

    我要指出,要使这个工作正常,您将不得不编辑生成的代码,或者滚动您自己的值对象。由于我如何使用它们进行验证,我通常会自己滚动。

    【讨论】:

    • 以前从未注意到 .GetChangeSet() 方法!感谢那! +1
    • 我最终采用的实际方法是使用表的名称创建一个分部类,并在 OnFooChanging() 中为我想要验证的字段实现验证代码。它可以在设置值而不是在 SubmitChanges() 时立即引发异常。我没有使用 ChangeSet,但它为我指明了正确的方向,而且很容易知道。
    • @Nick - 我觉得告诉你这个没用,因为我不记得我读过它的博客,但显然将验证与“OnChange”处理程序分开是个好主意,因为它允许复杂的验证场景,其中一个属性的验证取决于其他属性的值,等等。
    【解决方案2】:

    您还可以将OnValidate() 函数与 LINQ-to-SQL 实体的分部类一起使用。然后将在SubmitChanges() 期间但在数据发送到数据库之前调用OnValidate()OnValidate() 的一个好处是您可以通过 ChangeAction 枚举来区分 CRUD 操作。

    例如,

    public partial class YourEntity
    {
        partial void OnValidate(System.Data.Linq.ChangeAction action)
        {
            if(action == System.Data.Linq.ChangeAction.Insert)
               // Do insert
            ... etc. ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多