7

我正在开发我的第一个.NET项目(.NET 3.5,ADO.NET和C#)。我们已经构建了我们的实体模型,并试图构建一个干净的业务对象层。将业务层添加到ADO .NET Entity Framework

我们已经有了我们的基本实体模型,我们希望将某些业务级语义添加到默认数据访问器(导航属性等)。

例如,假设我们在PersonBankAccounts之间存在多对多关系。我们假设在业务层,我们希望添加冻结帐户的功能。现在,我们希望从一个人转到能力:

  • 所有的银行账户,
  • 其非冻结银行账户,并
  • 其冻结的银行账户。

当然,我们希望使名义大小写成为默认值:如果我浏览Person.BankAccounts(),我希望它返回其非冻结帐户。我可以添加导航属性Person.FrozenBankAccounts()Person.AllBankAccounts()

我们提出的两种方法似乎都有相当的代码味道。

  1. 我们无法找到覆盖实体模型方法的方法。因此,请将Person.BankAccounts()作为返回所有银行帐户的访问者。然后我们添加一个Person.FrozenBankAccounts()和一个Person.NonFrozenBankAccounts()
  2. 向代码库添加另一个显式图层,将所有访问包装为BankAccounts

对于方法1,问题在于名义商业案例(访问解冻的银行账户)是该批次中最不直观的方法名称。

在方法2中,当我们从实体模型层中对对象进行子类化时,我们必须重写每个方法以确保它不会从底层返回对象。因此,我们创建一个BL_Person,其中有一个BankAccounts()方法,该方法返回BL_BankAccount对象的集合。但在这种情况下,所有的代码似乎有点傻。

有没有比我们考虑过的更好的方法?如果没有更好的方法,我概述的两个中哪一个似乎是更好的解决方案(鉴于我们有类似50+的课程,我们需要合作)?

注:虽然做网络搜索,我找到了一封公开信给微软名为ADO .NET Entity Framework Vote of No Confidence这似乎暗示有没有在一个清晰的关注分离添加的好方法。

回答

-3

沟渠EF支持NHibernate

NHibernate的方式是:你创建业务对象,你告诉NHibernate如何将这些业务对象保存到数据库中。业务对象本身具有如何保存或加载或者正在使用NHibernate的知识。这被称为“持久性无知”。另外,你可以告诉NHibernate以任何你喜欢的方式保存和加载你的业务对象。它对你描述的场景有很好的支持。

停止写入数据访问层并停止代码生成它们。使用real man's ORM

+0

好的方法,但是,它也可以用EF4来实现。 – 2011-04-11 20:53:54

4

我没有LINQ to Entities的经验,但你的问题响了。在我上一个项目中,我遇到了另一个ORM几乎相同的问题。我没有让业务对象层的客户直接使用ORM生成的类或复制所有类并实现大量转发功能,而是定义了接口。

  • 在直线前进的情况下(没有业务逻辑),发展开销的接口:业务对象层将只能看到这些接口和你的实体类会实现这些接口,具有以下优点的客户是最小的。对于大多数成员,您不需要实现转发功能,只需从界面“派生”实体类并完成它即可
  • 如果您提到,在界面中可以有一个属性BankAccounts并通过显式接口实现让它转发给实施实体的NonFrozenBankAccounts。你当然也可以添加任何你想
  • 作为一个额外的好处检查,你可以轻松无明显改变任何客户端代码来做到这一点会像
0

一种方式交换底层持久层所以:

  1. 定义您的AllBankAccounts属性(甚至可能使其私人)。
  2. 定义部分Person类中的BankAccounts属性。该属性可以在AllBankAccounts方面使用LINQ来表示,即AllBankAccounts.Where(A =>!a.IsFrozen)
  3. 定义FrozenBankAccounts属性在部分Person类等步骤2.

希望帮助。

1

您可以添加从帐户
继承了两个新的实体类型 - RegularAccount和FrozenAccount
并添加您的isFrozen字段作为继承条件(表每一个分层)。

然后,你可以从“人”到“帐户”删除该协会,并创建两个新的协会:对人“帐户”

人到RegularAccount,名称导航属性。

Person to FrozenAccount,名称导航属性上的人“FrozenAccounts”。