C# 代码优先类是域类吗?

C# 代码优先类是域类吗?,c#,entity-framework,architecture,C#,Entity Framework,Architecture,我不确定我是否能正确地表达这一点,但是 我开始使用代码优先实体框架构建一个解决方案,并开始感觉我正在用太多特定于DB的信息污染我的域类(EF将使用这些类来生成DB):我必须使某些方法虚拟,以便发生延迟加载,我正在为我的属性添加明显针对DB配置的属性,等等。我还担心这些类在整个项目中的普及程度 首先,我是否有道理和/或我根本上误解了EF应该如何使用 其次,如果我理解正确,我的问题是:是否有其他人区分用于生成DB的代码优先类和域类(可能使用自动映射器从其他类中填充一个),您确实应该将您的数据实现(在

我不确定我是否能正确地表达这一点,但是

我开始使用代码优先实体框架构建一个解决方案,并开始感觉我正在用太多特定于DB的信息污染我的域类(EF将使用这些类来生成DB):我必须使某些方法虚拟,以便发生延迟加载,我正在为我的属性添加明显针对DB配置的属性,等等。我还担心这些类在整个项目中的普及程度

首先,我是否有道理和/或我根本上误解了EF应该如何使用


其次,如果我理解正确,我的问题是:是否有其他人区分用于生成DB的代码优先类和域类(可能使用自动映射器从其他类中填充一个),您确实应该将您的数据实现(在您的案例中,首先是EF代码)与您的域/业务逻辑分开。映射它们是一个开销,但是考虑当您需要从Web服务访问一些数据时发生了什么?

此外,域类通常包含数据库类中不存在的计算值或派生值(例如全名、地址),反之亦然(例如数据库日志信息)


首先,我会搜索存储库模式。

我花了很长时间尝试解决这个问题的不同方法。由于它的简单性,实体框架也可以很容易地将数据类用作域类

我的经验是,在小型项目中,您可以使用EF类作为域类。这是快速而简单的,但是随着项目的扩大,这开始成为一个问题,因为您无法以任何方式控制访问

最常见的情况是在EF类上公开导航属性。您的整个应用程序现在将能够导航整个数据集。因此,使用此模型,您将放弃对数据和域对象的所有控制

将域类与EF分开有几个优点。首先,您将不会与EF或code First紧密联系在一起。有了一定的分离/间接级别,您将能够在需要时交换数据框架。其次,您能够更有效地控制数据


就我个人而言,我已经到了一个务实的地步,在每个项目开始时我都会做出这个决定。如果项目很小,并且包含很多内容,那么我可能会为了简单而避免这种额外的抽象。在几乎所有的大中型项目和/或大型项目中,我都有这种分离。

这个问题应该继续问下去。对我来说是有意义的,但我恐怕在没有更多研究的情况下,我不知道答案,希望其他人能帮上忙。好的,我也会在programmers.Stackexhage上试试。干杯。根据我的经验,域类和代码优先类之间没有区别,它们是相同的类。如果您使用与EF相关的属性来装饰它们(这肯定很难看,并且会在域库中添加对EF的依赖),那么您可能会考虑改用fluentapi。这会使您的域类更干净,并将所有EF映射放在一个地方,这一点我更喜欢。花点时间学习它,我认为这是值得的:更多污染的好例子,干杯。这是我的解决方案开始采用的方法…作为一个额外的注意事项,我相信您知道-我会小心使用延迟加载。我意识到,快速获得结果非常有用,并且理解为什么它最初非常吸引人,但如果你能控制一切,你会过得更好。你可以在代码优先实体中添加计算值或派生值。代码优先意味着先对域进行编码,然后将其映射到数据库。对于Web服务,您应该使用DTO来聚合实体中的数据,并避免序列化中的业务代码。当然,您可以在代码优先的实体上拥有计算/派生属性,但如果您不想持久化它们,则必须将它们标记为这样,这是域对象中特定于DB的逻辑。。。