Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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#_Orm - Fatal编程技术网

C# 使用根持久化类或基持久化对象是一种架构气味吗?

C# 使用根持久化类或基持久化对象是一种架构气味吗?,c#,orm,C#,Orm,Alt.Net社区对Microsoft Entity Framework的一个主要抱怨是,它迫使您对存储在数据库中的所有内容使用一个基本的持久对象。我有两个与此相关的问题: 将“根持久类”作为应用程序中域对象的基础是可以接受的,还是这是一种体系结构气味 如果您觉得在应用程序中使用一个也可以,那么ORM框架强制您使用一个也可以吗?有没有理由避免让您这样做的框架 一段时间以来,我一直使用一个抽象的基本对象作为我所有的周期类的根。它使一些家务活变得更容易。除非您使用数据传输对象(DTO)进行持久化并使

Alt.Net社区对Microsoft Entity Framework的一个主要抱怨是,它迫使您对存储在数据库中的所有内容使用一个基本的持久对象。我有两个与此相关的问题:

  • 将“根持久类”作为应用程序中域对象的基础是可以接受的,还是这是一种体系结构气味

  • 如果您觉得在应用程序中使用一个也可以,那么ORM框架强制您使用一个也可以吗?有没有理由避免让您这样做的框架


  • 一段时间以来,我一直使用一个抽象的基本对象作为我所有的周期类的根。它使一些家务活变得更容易。

    除非您使用数据传输对象(DTO)进行持久化并使用该模型,否则根据我的经验,为可持久化的类提供根对象将大大减少代码重复并提高开发人员的生产效率。即使在使用DTO时,我也认为这可能会有所帮助,尽管我很少使用DTO,因此无法根据经验说话

    我不认为它是代码气味的原因如下:

  • 提高开发人员的生产力
  • 将持久性代码合并到一个类中
  • 易于更改为实现相同方法的另一个框架(只需更改所有业务类的继承,并更新原始根类的检查)

  • 编辑:Inline statichippo的回答,我同意他关于这个基类的观点,包括关于底层数据存储机制的信息(如表/列名、数据库类型等)。

    我的感觉是,假设上下文是

  • 别挡道
  • 不添加未在实体范围外使用的功能
  • 不会将您绑定到任何特定的ORM(某种程度上符合#2)

  • 因此,如果基类用于描述,例如,一个ID和相等的含义(因为很多时候,如果实体具有相同的ID,那么它们被认为是相等的),那么这很好。但是,当它开始描述以数据库为中心的信息(如表、列、实体状态等)时,我认为它开始有味道。

    对于复杂度从低到中等的应用程序,使用基本的持久对象确实可以提高开发效率

    但是,这样做会限制您的代码,并随着应用程序变得更加复杂而限制设计选项。显然,在一开始就用完了基类,这在C#和Java中非常重要。它还促进了关注点的分离

    我想说,在考虑任何ORM时,最重要的事情是问以下问题(摘自Jeremy Miller的文章):

    • 业务逻辑能否独立于数据库运行
    • 我可以独立于数据库模型设计域模型吗
    • 我的持久性策略如何影响我的业务逻辑

    我没有特别考虑活动记录模式。一旦你开始处理子对象、孙子孙女等,我发现不可能与你一起工作。+1是关于工作单位和坚持无知的文章的链接。这些都是关于ORM解决方案的好问题。唉,回想起来,这是显而易见的——你说的是基类功能,如污垢跟踪、行版本支持、身份比较等——而不是将实际的数据访问代码放在基类中!我会修改一下,看看我是否能更好地回答这个问题。这是思考这个问题的好方法。我将我的持久基类用于ID、相等和其他内务管理任务,但这些并没有将我耦合到任何特定的ORM或数据库。我也不喜欢DTO方法。我得到了大量的类,这使我的解决方案变得非常脆弱。我有一个共同的根,效率更高,但我想确保它不会咬我以后。