C# 我应该把EF中的实体看作域模型还是DTO';s

C# 我应该把EF中的实体看作域模型还是DTO';s,c#,entity-framework,data-access-layer,dto,bll,C#,Entity Framework,Data Access Layer,Dto,Bll,我不熟悉实体框架(如果重要的话,代码优先)。在我使用它的过程中,我一直在构建我的POCO类,将它们视为最终的域模型。对于像延迟加载这样的东西,我喜欢这样的想法,即我可以直接在表示层中使用这些实体,从而延迟加载我实际需要的东西 然而,我最近还了解了数据传输对象,这是我以前从未听说过的。这绝对有道理;我的最终域模型的行为可能有一些不属于DAL的业务规则。例如,我给Entity Framework的POCOSalesOrder是否应该包括它的最终方法,如AddItem(Product),如果Produ

我不熟悉实体框架(如果重要的话,代码优先)。在我使用它的过程中,我一直在构建我的POCO类,将它们视为最终的域模型。对于像延迟加载这样的东西,我喜欢这样的想法,即我可以直接在表示层中使用这些实体,从而延迟加载我实际需要的东西

然而,我最近还了解了数据传输对象,这是我以前从未听说过的。这绝对有道理;我的最终域模型的行为可能有一些不属于DAL的业务规则。例如,我给Entity Framework的POCO
SalesOrder
是否应该包括它的最终方法,如
AddItem(Product)
,如果
Product
SalesOrder.OrderDate
之前有一个
DiscontractedDate
,它就会抛出一个异常。这听起来绝对像是属于BLL的东西

所以,我想这意味着我给Entity Framework的POCO类应该更像DTO,像
SalesOrderDto
EmployeeDto
只是简单的小数据持有者,只有属性,没有方法,然后映射(可能使用AutoMapper)到我的BLL中的域对象,然后哪个会被传递到表示层


我是走对了路,还是错过了什么。我感到困惑,因为DTO的想法非常有道理,但我从未见过在实体框架的上下文中使用它们。

这取决于您。只映射属性,所以您可以自由添加方法(使用数据库,首先生成部分类,这样您也可以这样做)

通常,业务对象不一定直接映射到存储对象。在这种情况下,您的业务对象可以存在于一个或多个存储对象之外,是否(自动)将这些对象映射到DTO的第一个存储对象也取决于您


但是请注意,业务逻辑无论如何都不应该驻留在实体中。虽然可能会倾向于将
Customer.FullName
属性(返回
Customer.FirstName+“”+Customer.LastName
),但您需要这样的逻辑(就像
RegisterCustomer()
方法)放在适当的类中。

实体框架是一个对象相关映射器。因此,实体是到关系表的映射

是的

简单的小数据保持器,只有属性,没有方法


是。

在一些简单的情况下,实体可能是DTO、视图模型和域模型(在非常简单的情况下-同时)


但是,一般来说,最好保持单独的DTO、单独的视图模型和单独的域模型。有许多特定的东西是必需的,例如,对于表示层或DTO,但您不需要在实体类中实现它们。

我不久前也遇到过类似的问题,并得到了一些可能对您有用的答案: