我在过去的几天里一直在阅读有关实体框架的内容,并且设法得到了一个使用它的公平想法,但我仍然有一些问题,其中一些可能看起来有点过于基本。为了透视,我在asp.net Web应用程序中使用实体框架4.0。如果您可以回答任何问题,请继续。
使用POCO模板可以获得什么好处。我理解,如果我希望得到持久性的无知并让我的实体清楚地了解与存储相关的任何信息POCO实体是可行的方法。在使用POCO实体时,我可以相对轻松地从实体框架切换到说NHibernate吗?除了疏松耦合之外,我有任何重要的理由去POCO实体。另外,如果我使用POCO,我最终会失去任何东西。我仍然可以在代理的帮助下获得更改跟踪和延迟加载?
将EF模型的实体用作数据传输对象或业务对象是否正常。例如,我有一个单独的类库用于我的实体模型。假设我正在使用MVP,我想要一个公司中的员工列表。演示者将请求我的业务逻辑函数,该函数将查询实体模型以获取Employee列表,并将实体列表返回给演示者。在这种情况下,我的演示者需要引用EF模型。这是正确的方法吗?在我的asp.net web applciation的情况下,它不应该是一个问题,但如果我使用Web服务,这是如何工作的?这是走向POCO实体的原因吗?
假设Employee实体具有公司表的导航属性。如果我在'using'块中使用并包装数据上下文,并尝试访问BL中的导航属性,我假设我会得到一个异常。如果我关闭延迟加载并使用'include'linq查询来获取实体,我是否也会得到异常?在之前的帖子中,有人建议我每个请求使用一个上下文,暗示即使我在BL中,上下文仍保持活动状态。我假设我仍然需要分离对象并将其附加到我的下一个请求的上下文中,如果我希望坚持我做出的任何更改?或者我应该用新的上下文再次查询对象并更新它?
这个问题更多地与组织文件/最佳实践有关,并且是我之前发布的问题的后续问题。当我使用基于实体的单独文件来组织我的数据访问层时,组织涉及多个表之间的连接的查询的最佳实践是什么。我对组织仍然有些模糊。尝试过在网上搜索但没有太多帮助。
答案 0 :(得分:5)
极好的问题。我的第一个建议是以模式思考。随着那说......
补充阅读:
[编辑] NightHawk457,我非常抱歉没有回答你的问题。希望你想出来,但为未来的读者...
为了帮助每个人实现可视化,请使用域模型和存储库作为示例,想象下面的架构。请记住,有很多方法可以给猫皮肤,所以请把它当作自己的,并且不要忘记我上面的Grenade评论。
<强>提示:强>
正如您所看到的,IUnitOfWork和IMyDomainObjectRepository是暴露上述层功能的接口的角色明显分离。作为一个例子,IUnitOfWork可能是NHibernate,Entity Framework,LinqToSql或ADO.NET,其中工厂类或依赖注入注册的更改都必须改变。仅供参考,我也听说过Repository称为服务层。就个人而言,我喜欢第一个名字,不要与Web服务混淆。这个结构的下一个重要部分是实现数据库上下文(IUnitOfWork)的范围。一个简单的例子是一个ASP.NET页面,对于每个页面,每个存储库或该工作范围都有一个且只有一个IUnitOfWork。对于ViewModels,控制器等也是如此。因此,我们假设您需要使用两个存储库,即EmployeeRepository和HRRepository。然后,您可以在两者之间共享IUnitOfWork。为了跨页面,ViewModel或Controller边界,我们使用ID作为实体,然后从DB中提取它们并执行工作。您也可以跨越边界传递DTO并附加到上下文,但随后开始失去图层分离。
要继续,POCO课程不必自动生成。实际上,您可以从头开始创建实体类,并在OnModelCreating(DbModelBuilder mb)方法中的扩展DbContext类中执行映射。开始here,然后here并注意其他资源,google Fluent API,并阅读Diego的post。
至于验证,这是一个有趣的观点,因为如果可以在一个位置验证所有业务规则,那将是很好的。好吧,众所周知,这并不能很好地发挥作用。所以这是我的建议,尽可能在域对象中使用数据注释保持所有数据级别验证(即必需,范围,格式等),并在存储库中保留进程验证,并具有存储库的明确角色(即if(如果( isEmployee)这样做,否则)。我说清楚,这样你就不想在两个不同的存储库中添加一个Employee,其中必须重复验证。要调用验证,请启动here。捕获ValidationResults并向上游发送MyRepositoryValidationException,其中包含可以呈现给表示层的验证错误集合(例如,需要Employee)。尽管如此,不要忘记在表示层执行验证。例如,您不希望回发以确保员工拥有有效的电子邮件。
请记住平衡时间和精力与复杂性。对于简单的事情,请在您的EDMX文件中使用Data First或Model First。然后在其上放置一个存储库,该存储库还包含所有验证规则。