Asp.net 多层web应用中的实体框架POCO实体

Asp.net 多层web应用中的实体框架POCO实体,asp.net,entity-framework,poco,n-tier-architecture,Asp.net,Entity Framework,Poco,N Tier Architecture,我是EF4新手,以前从未有过使用EF4的经验。所以,如果这是一个非常简单的问题,请耐心听我说。 我在BOL中有我的POCO实体(.tt文件),在DAL中有.edmx文件(EDM),在表示层中有我的webapp。所有的业务逻辑都进入BLL层。 以下是参考资料: UI->BLL-DAL-BOL BLL->DAL-BOL DAL->BOL BOL->与我的项目无关。 1-我对图层区分的理解是否正确?我的方向对吗? 2-如何将ASP.NET成员资格提供程序与实体一起使用。我是否应该实现成员身份,并将sq

我是EF4新手,以前从未有过使用EF4的经验。所以,如果这是一个非常简单的问题,请耐心听我说。 我在BOL中有我的POCO实体(.tt文件),在DAL中有.edmx文件(EDM),在表示层中有我的webapp。所有的业务逻辑都进入BLL层。 以下是参考资料:

UI->BLL-DAL-BOL
BLL->DAL-BOL
DAL->BOL
BOL->与我的项目无关。

1-我对图层区分的理解是否正确?我的方向对吗? 2-如何将ASP.NET成员资格提供程序与实体一起使用。我是否应该实现成员身份,并将sql server中的所有用户表映射到实体


2-如何添加自定义验证?我不是指maxlength或有效电子邮件…,我指的是访问级别。例如,我希望某些用户能够修改我的网站中的一个字段(比如productprice)。我应该在哪里使用User.IsInRole方法?BLL没有任何对用户信息的引用。我是否应该将一些参数传递给BLL(如“bool CanChangePrice”)以澄清访问级别?

1-我认为您对层的区分是正确的。 我不会在UI中引用DAL,因为在我的项目中,我更喜欢只有中间层访问DAL。但这并没有错。 看来你的方向是对的

2-据我所知,没有与EF合作的会员资格提供商。
因此,在我们使用会员资格的项目中,我们做了如下工作:

  • 使用
    aspnet\u regsql.exe创建表
  • 配置
    Web.Config
    以使用
    sqlmembershipProvider
  • 在web.config中添加了另一个连接字符串(一个用于成员身份,一个用于EF)
  • 已生成包含所有表(包括成员表)的EDMX文件
在代码中,
用户管理器
/
角色管理器
(BLL或DAL,具体取决于您的体系结构)使用标准成员身份方法获取信息。并且始终使用成员对象,而不是EF对象。因此,实际上,用户/角色管理部分与EF分离

当自定义表和成员表之间存在链接时(例如,当您希望将其中一个表与
aspnet\u用户
表链接以保留插入数据的用户的引用时),我们仅使用
aspnet*
EF实体

3-对于正确的管理,我将使用BLL
RightManager
,允许用户界面知道用户是否可以更改字段(以便您可以禁用它或阻止输入),并在验证方法中使用此信息。
在我的项目中,我使用一个
Right
表,并将一个Right与一个角色相关联。在
RightManager
中,提供
RequestRight(Right)
方法。
如果您的权限管理过于简单,无法创建表,只需在
RightManager
中使用User.IsInRole()(因此我会在BLL中使用它)。

如果验证方法是“基本”的,我会将其放在UI中,如果它包含更复杂的规则(例如,涉及DAL访问),我会将其放在BLL中。

哇,Kamyar,这里只包含几个问题;-)我不确定我是否能涵盖所有可能的领域,但现在开始

项目结构
-一般来说,你的项目结构是正确的,你的参考资料也是正确的。有些人可能会争辩说,你想把你的顾虑分开一点,打破一些参考资料,但我个人认为你的结构是可行的

  • 实际上,我倾向于将EDXM和POCO放在同一个项目中。我只有一个包含EDXM和Model.Context.tt的Entities文件夹,一个用于Model.tt和虚拟POCO的POCO文件夹(如下),以及一个用于我的存储库和工作单元的存储库文件夹

  • 我还创建了一个名为virtualpocs的文件,它是绑定到T4生成的POCO的部分类。我的设计往往与数据库结构紧密结合。VirtualPOCO给了我一点灵活性,可以在那些一次性的情况下偏离DB设计。这里没有太多内容,只是每个项目似乎都有一些非常具体的需求

  • >P>您可能还需要考虑存储库、表数据网关或活动记录设置。所有这些模式都可能与工作单元相结合。有大量的设计模式,您的需求或偏好可能会促使您选择其中之一。这里的要点是屏蔽上层直接访问EF4上下文。通过这种方式,您可以集中连接和事务管理,并确保上层仅使用POCO,而不是意外地保留linq to sql对象

会员资格提供者
会员资格提供商和EF之间存在着明显的分歧。但是,您可以下载SQLMembershipProvider的源代码并将其转换为使用EF。我真的做了这个转换。该文件大约有1500行长,但没有大量的ADO代码

你们并没有问,但我想我应该解决的是,你们是否想使用会员资格提供者。如果您正在执行基本的成员资格管理和角色,那么成员资格、角色和配置文件提供程序可以为您节省大量时间。要深入了解这些功能,请查看4GuysFromRolla()上的系列文章

如果你的需求更复杂,IMHO,那么会员服务提供商很快就会崩溃。例如,当用户为您的站点注册时,您必须立即在几个不同的表中创建行。成员资格提供者是通过webconfig注册的,并使用成员资格提供者界面。它只接受create函数中的某些字段。那么一个男孩该怎么办?好的,你可以在你的控制器中打开一个更大规模的事务,运行成员资格提供者添加用户功能,运行你自己的