实体框架验证

Entity Framework Validation

提问人:Micah 提问时间:10/10/2008 最后编辑:StuartLCMicah 更新时间:8/11/2014 访问量:22900

问:

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

C# .NET 实体框架 验证

评论


答:

11赞 smaclell 10/19/2008 #1

我以前没有实际使用过实体框架,但快速搜索表明您有几个选项。

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

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

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

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

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

根据这篇文章演练,有部分方法可用于验证。这似乎是您最好的选择,因为它不是很侵入性,您可以有选择地实现所需的验证。

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

评论

0赞 Jim Mitchener 11/4/2009
#2 和 #3 有什么不同?它生成的部分方法是 OnChanged 事件......除非我错过了什么。
0赞 smaclell 11/9/2009
你可能是对的。我已经很久没有看过EF了。
3赞 ladenedge 2/10/2010
我将 #2 和 #3 分别视为实体级和属性级验证。当然,这两种策略有不同的用途:实体级验证一起测试所有属性的有效性(例如,互斥属性不是同时设置的),而属性级验证一次只考虑单个属性的内容(例如,电子邮件地址的形式是否正确)。
3赞 aogan 10/19/2008 #2

如果使用 ASP.NET MVC,则可以使用验证应用程序块或 System.ComponentModel.DataAnnotations。文章使用数据注释使用应用程序块展示了如何使用 Linq 执行这些操作,但 entity-framework 的用法应该类似。

评论

0赞 Jeff Atwood 11/17/2009
链接似乎已过时?
0赞 Shimmy Weitzhandler 2/10/2010
链接已修复,后期编辑 - 它适用于 MVC。谢谢杰夫
6赞 Shimmy Weitzhandler 1/15/2010 #3

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

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

因此,不要努力实现过于复杂的验证逻辑......

评论

0赞 ladenedge 2/10/2010
奇怪的是,由于某种原因,PEM 扩展及其示例不再通过 MSDN 获得。如果有人有更新的链接,我会喜欢更新的链接!
0赞 Shimmy Weitzhandler 2/10/2010
我希望他们没有愚弄我们......我想我错了,开箱即用,我现在意识到它只是一个插件。它说该插件可以从 visualstudiogallery.msdn.microsoft.com/en-us/ 下载,但请查看链接以查看它是否损坏。
0赞 Shimmy Weitzhandler 2/10/2010
我在评论中找到了这个链接 code.msdn.microsoft.com/DesignerExtStartKit/Wiki/...,还没有时间结帐。
0赞 jbe 7/29/2010 #4

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

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

1赞 Rob 11/14/2010 #5

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

public abstract class ValidationObjectContext : ObjectContext{
    ...

    public override int SaveChanges(SaveOptions options){
        ValidateEntities();
        return base.SaveChanges(options);
    }

}

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

0赞 Kamran 8/21/2013 #6

请考虑在实体中实现 IValidatableObject。