Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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_Domain Driven Design - Fatal编程技术网

C# 关于将实体映射到域对象的建议

C# 关于将实体映射到域对象的建议,c#,entity-framework,domain-driven-design,C#,Entity Framework,Domain Driven Design,我目前在一个项目中工作,我们开始使用DDD方法构建应用程序。我们现在首先考虑使用EntityFramework6代码来帮助我们实现数据持久性。我的问题是如何最好地处理域对象和EF实体之间的数据映射 既然您首先考虑使用实体框架6代码,为什么不直接使用EF实体作为域对象呢?所以首先设计领域模型,然后设计数据库结构 我一直在使用NHibernate,并且相信在EF中,您还可以指定从DB表到POCO对象的映射规则,尤其是EF6。在EF实体上开发另一个抽象层是一项额外的工作。让我们对此负责 我不同意您可能

我目前在一个项目中工作,我们开始使用DDD方法构建应用程序。我们现在首先考虑使用EntityFramework6代码来帮助我们实现数据持久性。我的问题是如何最好地处理域对象和EF实体之间的数据映射

既然您首先考虑使用实体框架6代码,为什么不直接使用EF实体作为域对象呢?所以首先设计领域模型,然后设计数据库结构

我一直在使用NHibernate,并且相信在EF中,您还可以指定从DB表到POCO对象的映射规则,尤其是EF6。在EF实体上开发另一个抽象层是一项额外的工作。让我们对此负责

我不同意您可能会阅读的这篇文章,还有许多其他文章,人们只是将EF实体用作域对象:

  • 那么问题
  • 关于DDD的一般信息
当您开始构建表示层并面对大量特定于UI的视图模型时,它肯定会对您有所帮助。它在构建时很有用,在没有公共setter的情况下,对于真正的域对象来说有点无用

Jimmy Bogard的一篇老帖子告诉我们,
“没有双向映射,因为我们从来不需要双向映射。”

那么我们用AutoMapper做什么呢?我们的五个简介包括:

  • 从域到视图模型(MVC的强类型视图模型)
  • 从域到EditModel(MVC中表单的强类型视图模型)
  • 从EditModel到CommandMessages–从松散类型的EditModel到强类型的断开消息。单一模型 可能会生成六条消息
  • 从域到报告模型–强类型Telerik报告
  • 从域到EDI模型–用于生成EDI报告的扁平化模型

哦,不,我根本不会增加那层

NHibernate和Entity Framework Code First(我会使用EF)就是为了解决这个确切的问题而设计的——将域对象映射到关系模型(关系模型在设计上没有相同的约束,所以可能会,也可能会是不同的形状)


浪费EF出色的映射能力,用其他东西取代它,甚至是AutoMapper,这似乎是一种耻辱。

为了让你的应用程序和你自己长期保持清醒,永远不要用持久性相关的问题(什么数据库、什么orm等)启动你的DDD应用程序,并且总是(是的,总是)在开发的最后阶段触摸数据库

为您的域以及除持久性之外的任何其他模型建模。使用存储库模式使应用程序与持久性分离。根据应用程序的需要定义repo接口,而不是绑定到db访问方法(这就是为什么您稍后要实现持久性,这样您就不会试图将应用程序与持久性细节结合起来)

为repo接口编写内存实现,这通常意味着在列表或字典上有一个简单的包装器,因此编写速度非常快,更重要的是,更改起来非常简单。使用这些来实际测试和开发应用程序

在界面稳定且应用程序正常工作之后,就可以编写持久性实现了,在这里您可以使用任何您想要的东西。在你的例子中,EF和它来映射

这是非常主观的,没有对错之分,只有你喜欢的做事方式

就个人而言,我有使用memento的习惯,因此我从域对象获取memento,然后手动将其映射到(微型)ORM实体。我之所以手动执行此操作,是因为我的纪念品包含值对象。如果我要使用AutoMapper,我需要对它进行配置,本质上,我编写的代码比手工编写的代码要多

更新(2015)

现在,我只是将对象Json,然后使用特定的读取模型,或者直接将其存储在包含序列化对象的
Data
列的读取模型中。我只在非常特殊的情况下使用纪念品/更新>

根据域对象的外观和EF实体的外观,您可以在大多数映射中使用automapper。不过,测试存储库会比较困难

这取决于您如何操作,找到适合您风格的方式,并且易于维护,但永远不要设计或修改域对象以使其更兼容或与ORM实体匹配。这与更改数据库或ORM无关,而是让域(以及应用程序的其余部分)与持久性细节(ORM就是持久性细节)适当地解耦


因此,请抵制重用其他层实现细节的诱惑。应用程序分层结构的原因是您希望解耦。保持这种方式。

当我自己研究这个主题时,我发现我认为大多数使用或推荐使用EF POCO作为域对象的开发人员根本不需要DDD。DDD是复杂域逻辑的推荐方法,当您有复杂域逻辑时,您不太可能有域逻辑和数据存储结构的1:1映射。的确,在许多情况下,您的域对象的结构与数据库设计类似,但随着域变得更加复杂,您会发现许多域实体都需要偏离数据的物理存储方式。如果你发现自己想要使用自动映射器,我也有同样的观点——在这种情况下,你可能也不需要DDD。您的应用程序可能很简单,不会从DDD的复杂性中获益。请注意,DDD不是一种体系结构或设计模式,它是一种构建软件的方法