【问题标题】:Entity Framework Validation实体框架验证
【发布时间】:2010-09-16 12:13:57
【问题描述】:

我正在准备开始一个新项目,我一直在研究实体框架。我的问题是验证实体的最佳策略是什么?我从事的其他项目在大多数验证中都使用了属性,但显然这在实体框架中是不可能的。是通过处理属性设置器中的部分方法来做到这一点的唯一方法吗?非常感谢所有建议。

【问题讨论】:

    标签: c# .net entity-framework validation


    【解决方案1】:

    我之前没有实际使用过实体框架,但快速搜索表明您有多种选择。

    1) 在应用程序的另一层进行验证

    总是一个选择,我只是想我会明确地把它扔掉。

    2) 挂钩实体的 OnChanged 事件,然后执行验证

    如果您有许多不同的属性可以为每个实体更改,那么可能会很脆弱并且会变得混乱/缓慢。

    3) 实现部分方法来验证属性更改

    根据this post 和this walkthrough,有部分方法可用于验证。这似乎是您的最佳选择,因为它不是很侵入性,您可以有选择地实施您想要的验证。

    我希望这会有所帮助。祝你好运。

    【讨论】:

    • #2 和#3 有何不同?它生成的部分方法是 OnChanged 事件……除非我遗漏了什么。
    • 你可能是对的。好久没看EF了。
    • 我将 #2 和 #3 分别读作实体级和属性级验证。当然,这两种策略有不同的目的:实体级验证同时测试所有属性的有效性(例如,互斥属性未同时设置),而属性级验证仅考虑单个属性的内容时间(例如,电子邮件地址的格式正确)。
    【解决方案2】:

    在 .NET 4 中,Entity-Framework 将提供开箱即用的验证支持。

    查看:http://blogs.msdn.com/adonet/archive/2010/01/13/introducing-the-portable-extensible-metadata.aspx

    所以不要努力实现过于复杂的验证逻辑...

    【讨论】:

    • 奇怪的是,由于某种原因,PEM 扩展及其示例不再可通过 MSDN 获得。如果有人有更新的链接,我会很高兴!
    • 我希望他们没有愚弄我们......我想我说的开箱即用是错误的,我现在意识到它只是一个插件。它说可以从visualstudiogallery.msdn.microsoft.com/en-us/… 下载该插件,但请查看链接以查看它已损坏。
    • 我在cmetscode.msdn.microsoft.com/DesignerExtStartKit/Wiki/…找到了这个链接,还没来得及结账。
    【解决方案3】:

    如果您使用 ASP.NET MVC,那么您可以使用验证应用程序块或 System.ComponentModel.DataAnnotations。文章Using Data AnnotationsUsing Application Block 展示了如何使用Linq 进行操作,但与entity-framework 的用法应该类似。

    【讨论】:

    • 链接似乎已过期?
    • 链接已修复,后编辑 - 它仅适用于 MVC。谢谢杰夫
    【解决方案4】:

    我们已经覆盖了对象上下文并拦截了 SaveChanges() 方法

    public abstract class ValidationObjectContext : ObjectContext{
        ...
    
        public override int SaveChanges(SaveOptions options){
            ValidateEntities();
            return base.SaveChanges(options);
        }
    
    }
    

    这样,验证将一直持续到建立连接之前的最后一分钟,但在您(期望)对图表感到满意并准备好提交之后,(与验证任何更改的其他选项相反,因为有些像我们这样的复杂规则只有在设置了几个属性后才有效。)。我们有两个级别的验证,基本属性验证,例如字符串长度、可空性等。以及业务逻辑验证,这可能需要检查多个对象的规则,可能需要访问数据库进行确认。

    【讨论】:

      【解决方案5】:

      如果您使用的是 WPF 或 Windows 窗体,那么您可以实现 IDataErrorInfo 接口。

      WPF Application Framework (WAF) 项目的 BookLibrary 示例应用程序展示了如何验证实体框架创建的实体。

      【讨论】:

        【解决方案6】:

        考虑在您的实体中实现 IValidatableObject。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 2011-04-14
          • 1970-01-01
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多