asp.net - 多层Web应用程序中的 Entity Framework POCO实体

标签 asp.net entity-framework poco n-tier-architecture

我是EF4的新手,之前没有任何经验。因此,如果这是一个非常简单的问题,请多多包涵。
我在BOL中有POCO实体(.tt文件),在DAL中有.edmx文件(EDM),在表示层中有webapp。所有业务逻辑都进入BLL层。
这里是引用:

用户界面-> BLL-DAL-BOL
BLL -> DAL-BOL
DAL -> BOL
BOL ->没有我的项目。

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

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

最佳答案

哇,卡米亚尔,这个问题只涉及几个问题;-)我不确定我是否会讲完所有可能的内容,但是可以。

项目结构
-通常,您的项目结构是正确的,并且您的引用是正确的。有人可能会争辩说您想稍微分开您的关注点并破坏一些引用,但是就我个人而言,我认为您的结构可行。

  • 实际上,我倾向于将我的EDXM和POCO保留在同一项目中。我只有一个Entities文件夹,其中包含EDXM和Model.Context.tt,一个用于Model.tt和我的虚拟POCO的POCO文件夹(如下),以及一个用于我的存储库和工作单元的Repository文件夹。
  • 我还创建了一个名为VirtualPOCO的文件,该文件是绑定(bind)到T4生成的POCO的部分类。我的设计往往与数据库结构紧密相关。在那些一次性的情况下,VirtualPOCO给了我一点灵活性,使其可以偏离数据库设计。这里没有太多内容,每个项目似乎只有这几个非常具体的需求。
  • 您可能还需要考虑存储库,表数据网关或事件记录设置。所有这些模式都可能与工作单元结合在一起。有无数的设计模式,您的需求或偏好可能会插入您走向另一个。这里的重点是防止高层直接访问EF4上下文。这样,您可以集中连接和事务管理,并确保上层仅使用POCO,而不会意外保留linq-to-sql对象。

  • 成员(member)提供者
    在MembershipProvider和EF之间肯定存在 split 。但是,您可以下载SQLMembershipProvider的源代码,并将其转换为使用EF。我实际上做了此转换。该文件长约1500行,但没有大量的ADO代码。

    您没有问,但我想我要解决的是,您是否要使用成员(member)资格提供程序。如果您正在执行基本的成员资格管理和角色,则成员资格,角色和配置文件提供程序可以为您节省大量时间。要深入了解这些功能,请查看4GuysFromRolla(http://www.4guysfromrolla.com/articles/120705-1.aspx)上的系列文章。

    如果您的需求更加复杂,恕我直言,成员资格提供者很快就会崩溃。例如,当用户为您的站点注册时,您必须立即在少数几个不同的表中创建行。好了,成员资格提供者是通过webconfig注册的,并使用成员资格提供者界面。它仅接受create函数中的某些字段。那男孩要做什么?好了,您可以在 Controller 中打开一个较大规模的事务,运行成员资格提供者添加用户功能,运行您自己的MyCustomUserStuff(),然后提交事务。我觉得这种方法没有吸引力的两个原因是,我现在在事务堆栈中渗入了事务代码,如果我需要做的就是添加一些额外的字段,那么我现在就不必要地将数据库调用增加了一倍。

    我想我只是发现成员资格提供者受到了很大的限制,一旦进入那里并成为我自己的自定义成员资格提供者,使用MS模型的好处就很快消失了。

    验证
    我认为这里的答案是响亮的-这取决于。您的权限是静态的吗?也就是说,“SiteManagers”组中的人可以在整个网站上进行编辑吗?还是您的权限更加精细?意味着SiteManagers可以访问分布在这22个表中的这75个字段,还是更多基于表的字段?此外,权限有多可变?您的站点管理员是否需要能够经常打开/关闭或关闭对不同表中各个字段的访问?

    我想我需要更多地了解您对特定答案的要求。请记住,授予权限的粒度越细,客户端将对理解和管理所有权限的配置头痛就越多。

    另外,您正在使用什么后端?许多DBA都会面对这些决定。在该世界中,一种经常使用的策略是创建一系列 View ,其中每个 View 公开用户所拥有的列。例如,EmployeesHR View 将仅公开HR人员有权访问的那些列,EmployeeDirectory将仅公开目录可访问的那些字段,然后为HR用户授予HR View 的权限,但不授予其基础表的权限。只是一个想法。

    无论如何,希望这会有所帮助。

    关于asp.net - 多层Web应用程序中的 Entity Framework POCO实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3307577/

    相关文章:

    c# - 如何从 Entity Framework 中的多个数据库/表创建单个对象

    sql - 在 Entity Framework 中创建关联?

    可移植联系人 API 的 .NET 实现

    asp.net - Task.Run 之后 HttpContext.Current 为 null

    asp.net - 仅通过 Web.config 为特定位置添加缓存 header

    c# - EF6 和 azure 辅助角色 : underlying provider fail on open

    asp.net-mvc - 在 MVC 中实例化和处置 DbContext 的最佳方法是什么?

    c# - 是否有一个 C# 的 ORM 工具可以 'black box' 数据库?

    asp.net - 无法对齐 div

    c# - SignalR WebSocket 握手 : Sec-WebSocket-Accept header is missing