Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现业务逻辑验证的最佳实践-实体框架_C#_Entity Framework_Entity - Fatal编程技术网

C# 实现业务逻辑验证的最佳实践-实体框架

C# 实现业务逻辑验证的最佳实践-实体框架,c#,entity-framework,entity,C#,Entity Framework,Entity,我第一次使用实体框架,在将新对象插入数据库之前,我需要添加业务逻辑,以下是我考虑的选项: 在DataContext级别实现业务逻辑-通过重写SaveChanges方法 使用OnPropertyChange分部方法为每个实体实现业务逻辑 将生成的代码封装在实现验证层的自定义类中 在实体框架上管理业务逻辑时,哪种方法是最佳实践(也许你的答案是这样的;) 另一种考虑的方法是完全从业务逻辑层完全拆分数据访问层。 创建一个只直接访问实体框架的数据访问接口,然后在一个单独的项目中,我将创建您的业务逻辑类,

我第一次使用实体框架,在将新对象插入数据库之前,我需要添加业务逻辑,以下是我考虑的选项:

  • 在DataContext级别实现业务逻辑-通过重写SaveChanges方法
  • 使用OnPropertyChange分部方法为每个实体实现业务逻辑
  • 将生成的代码封装在实现验证层的自定义类中

  • 在实体框架上管理业务逻辑时,哪种方法是最佳实践(也许你的答案是这样的;)


    另一种考虑的方法是完全从业务逻辑层完全拆分数据访问层。

    创建一个只直接访问实体框架的数据访问接口,然后在一个单独的项目中,我将创建您的业务逻辑类,通过该接口与数据访问层进行接口。业务逻辑项目中没有实体框架引用

    通过这种方式,层被组件化,并且更容易作为多个程序集分发,以便进行两层或三层访问。

    也许可以尝试阅读有关我的经验:

  • 这是可行的,但这是相当多的工作,对于许多必须验证的实体,这可能会比较慢。实际上,EFv4.1会自动执行此操作
  • 我不喜欢这种方式-它只服务于单个属性更改,不适用于复杂的验证,在获得有效状态之前需要修改多个属性
  • 也许-我喜欢验证需求。每个实体都可以公开
    Validate
    方法,该方法将检查整个实体的状态是否正确 但是,只有始终使用整个实体,所有这些才有效。一旦开始使用部分更新和其他功能,您仍然需要在其他地方处理验证。这是按需验证的另一个+1。

    看看-验证在实体本身内部

    这是一个非常干净的方式来组织你的项目

    当您使用了s时,实体验证的明显位置是POCO本身


    对Customer对象的任何验证实际上都在Customer类中,这是有道理的。

    我更喜欢数字3的版本。我喜欢抽象实体框架或者类似的东西,以防将来我想/需要替换EF


    然后,对于验证/业务逻辑,我使用对应用程序有意义的任何验证技术,但通常是(用于UI最小验证)和验证框架(如用于最大验证/业务规则)的某种组合。此验证/业务逻辑存在于实体类(DataAnnotations)和抽象层中,抽象层通常是我的应用程序中的服务层。

    您可以通过创建另一个部分类定义来扩展您的类,大多数EF模板将实体定义为部分定义,以便人们方便地扩展它们。如果您正在使用WPF或Silverlight,您可能会希望这样做,因为大多数内容都不是直接绑定的,您可能有一个布尔值并希望将其转换为颜色,等等。编写转换器的速度很慢,需要更多的代码来设置,然后只需在BusinessObjects上创建新的getter即可


    我们使用EF 4.0 STE(自跟踪实体)已经有一段时间了,我们用自己的部分定义扩展了其中的大部分。我们对创建STE的T4模板做了一些修改,以允许访问自定义部分类定义的构造函数和其他一些小改进。

    Visual Studio杂志的文章解决了这个问题:


    您使用的是什么版本的EF?很好。您可以轻松创建POCO,我使用的链接是一个很好的起点。这是最接近选项3的一个。感谢所有伟大的回答。这听起来是我真正想要的,你能在我之前的评论中添加更多关于如何绑定这两个组件(实体-业务逻辑)的解释吗?在我之前的评论中,空间用完了,但是我的业务逻辑层类将以相同的方式在它们自己的名称空间中进行构造。通常我会把自定义操作、验证和其他一切都放在这里。您的业务逻辑类只能使用必要的数据访问接口。你可以更进一步,把你的图层分成不同的项目和组件,这可能有点过分了。BL类接口的好处是可以通过web服务或WPF直接访问它们。它是灵活和组件化的。我同意,您使用哪种方法来解决您的问题?