【问题标题】:Best approach to share Entity Framework model between application layers在应用层之间共享实体框架模型的最佳方法
【发布时间】:2013-10-07 05:10:28
【问题描述】:

我想创建一个有几个层的 asp.net 应用程序(经典层设计):一个业务层和一个表示层。数据层似乎已经过时,因为 EF 完成了所有工作。

所以当我在业务层中创建 EF 模型时,我无法使用表示层中的实体,因为我无法为显示和验证等添加数据注释(尤其是显示属性通常是表示层的一部分)。对我来说,将所有数据复制到表示层中类似的“viewmodel”类似乎不太好。

那么有没有一种好的方法可以在业务层中创建对象上下文并为实体提供共享的“合同”组件?我发现的大多数示例都将所有内容放在一个组件中,我认为这不是更复杂应用程序的最佳方法。

【问题讨论】:

  • 查看模型是要走的路。对你来说可能看起来不太好,但这是正确的方法。
  • EF IS 你的数据层。您应该构建它,以免它潜入您的业务层。如果你的老板说“停止所有 EF 工作!我们必须切换到休眠模式,因为我的侄子说了规则!”?
  • @paqogomez - 解雇你的老板?
  • 我希望保存所有的写作工作和运行时数据复制。是的,我在过去的 EF 和视图模型中使用了这种方法。
  • 我希望保存所有的写作工作和运行时数据复制。是的,我过去使用过这种方法:EF 和视图模型。但是在我的上一个项目中,我意识到,例如在我的应用程序的管理部分,大多数视图模型与所有 EF 模型类非常相同,并且我有很多编写工作只是为了映射只有 id 和 name 加上最终一个标志的模型.谢谢大家的回复。在我看来,我过去在规划分层应用程序时所做的一切都是正确的。

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

您应该从业务层中抽象出 EF,切勿直接使用此类框架。我通常创建一个通用存储库接口和一个实现该接口的通用 EF 存储库(这是您的数据层)。 IoC 框架将负责在运行时注入正确的实现。

此外,您准确地描述了表示层中 ViewModel 的需求。他们只负责在视图上显示您需要的信息以及基于数据注释的验证。一开始它们可能看起来像您的域实体的重复,但最终它会为您省去很多麻烦,这绝对是要走的路。

您的业务层应该生成域实体,在您的控制器中将它们映射到您的 ViewModel。您可以为此使用AutoMapper

您可以查看this question 并回答有关服务/业务层和域/视图模型的更多信息。

【讨论】:

  • 好的,这只是我也很容易使用的方法。 EF、视图模型、映射和 IOC。我只是希望避免在设计时编写工作和在运行时复制数据。感谢回复
  • @MartinH。我总是最终得到与我的域模型完全不同的 ViewModel。通常它们是来自多个域模型等的属性的组合。但是,是的,有时它们几乎相同,除了数据注释。我还提到了 AutoMapper,这为您节省了手动将域模型映射到 ViewModels 的艰巨任务。
【解决方案2】:

你可以有这样的层。

  1. EF 模型层项目
  2. 业务层,将与 EF 模型交互
  3. 表示层,与业务层交互,如果需要也可以参考EF模型

您可以在 EF 模型层中创建部分类 - 用于数据注释等。所以它可以反过来 - 也将用于业务层。

【讨论】:

  • 是的,但是我认为数据注释(尤其是显示属性)是表示层的一部分,我只能在定义了EF模型的项目中添加属性。
【解决方案3】:

创建与您的实体完全相同的数据转换对象 (DTO),但它们只有简单的属性。然后使用automapper在Entities和DTO之间进行映射。

【讨论】:

    【解决方案4】:

    在这里我给你一个很好的建议。

    首先将您的应用程序划分为层

    **SM.MVCApp**  :-  This is for MVC application 
    **SM.Service** :- This layer is for holding the business logic (Interface & Class)
    **SM.Data**    :- This layer is to interact with database using Entity framework (Repository & UOW)  
    **SM.Entity**  :- This layer is responsible for having property in class that will be mapping with the table of database.
    

    SM.Service 示例

    public interface IStudent
    {
        IQueryable<Entity.Student> GetAllStudent();
    
        Student GetStudentByID(Int32 StudentID);
    
        void CreateStudent(Student objStudent);
    
        void UpdateStudent(Student objStudent);
    
        void DeleteStudentvoid(Student objStudent);
    
        void SaveChanges();
    
        List<Entity.Student> SearchStudent(string Name, int Age, string EmailAddress, string CountryName);
    
        void MakeRelation(Entity.StudentCourceMap objMap);
    }
    

    现在显示 如何创建 SM.Data 层

    1. 首先创建用于创建数据库和表的DBContext类
    2. 然后为 crud 操作创建 IRepository * Repository 类
    3. 然后创建 UOW(工作单元)

    【讨论】:

    • 谢谢,但我尝试了存储库和 UOW,但在复杂情况下它不是很有用(或者我实现错误)。
    • 澄清:您的学生示例在获取学生时有效。但是当我有一个学生对象,想知道他的时间表,想知道他的结果时,我正在为每个链接表创建存储库(并且我知道具有数百个表的应用程序)。如果我有 EF 模型,我可以直接走得更远。
    • 在这种情况下你可以使用“joins”
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多