【问题标题】:Separating Entity Framework 6 projects into layers将 Entity Framework 6 项目分层
【发布时间】:2020-09-25 13:57:23
【问题描述】:

我正在阅读有关 Entity Framework 6 的教程并尝试将其实现到测试项目中。这将针对 ASP .Net 网络表单,但我认为 MVC 项目的原理是相同的。

我有 3 个项目 DAL、BAL 和 Webforms 项目。

我创建了一个名为 DAL 的类库,安装 EF 6。添加 ADO.Net 实体数据模型,链接到数据库。这有 2 个表格以方便客户和地址。连接字符串存储在 app.config 文件中。

Table 1 (Customers)- Id, Firstname, Surname
Table 2 (Addresses)- Id, PrimaryAddress, CustomerId
  1. 我看到一个 .tt 文件并展开它,我看到所有类似于我的数据库表的类。如果我想添加另一种方法,即

    Public string GetCustomerFullName
    {
      return Firstname + " " + Surname;
    }
    

在 DAL 项目中,我将在何处以及如何执行此操作?我在考虑扩展 .tt 文件(即客户类)时创建的类,但我有一种偷偷摸摸的感觉,如果我要重新生成/刷新 ADO.Net 实体数据模型文件的某些部分,例如,这可能会被覆盖。如果添加了表格或其他内容?

  1. 我创建了另一个名为 BAL 的类库(这是我想调用所有 CRUD 操作的地方)。从 Nuget 安装 EF6。我添加了对 DAL 项目的引用。目前,本教程为同一项目中的每个方法(即添加、更新等)添加了一个新的 Dbcontext 实例。

如何在本项目中引用 DAL 项目中创建的 DbContext?我已经阅读了混合线程,新上下文可能会产生奇怪的行为,而其他人认为重用相同的上下文是/不是一个好主意。有人可以告诉我如何以正确的方式引用 DbContext。我通常有一个抽象类,然后将其添加到我的类中,例如

    public class CustomerService : DbContxtService, ICustomer
    {
     public void Add(Customer c)
    {
    // Add customer
    }
    }
  1. 如何设置 DAL 项目以从我的 Web 表单项目中检索连接字符串(这样我就不需要总是更改类库并且可以有一个区域来更改连接字符串)

【问题讨论】:

  • 如果这些单独的项目不会被任何其他解决方案使用,那么,IMO,制作单独的项目是没有意义的。只需将所有内容放在一个项目中即可。 “层”是一个让人们认为他们正在做的架构很好的术语,但这只是一个参考,而不是一个层。
  • 谢谢,1. 是的,它会被其他项目使用。 2. 你是说我在原帖中列出的做事方式是错误的吗?
  • 1.请不要使用 webforms,它已经过时了,使用 MVC。 2. 你问的关于映射到所谓的领域驱动设计和领域有界上下文的问题,这是一个高级概念,如果没有正当理由这样做实际上会造成更大的伤害,所以我建议你先彻底研究这些主题。

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


【解决方案1】:

如果我想添加另一种方法.. 我会在哪里做。

实体定义为partial classes。您可以将成员添加到不会被覆盖的单独文件中的类中。

如何在本项目中引用DAL项目中创建的DbContext?

您设置对项目的引用并为您的(单个)DbContext 上的每个服务添加一个构造函数依赖项。

例如

public class CustomerService 
{
    private MyDbContext db;
    public CustomerService(MyDbContext db)
    {
       this.db = db;
    {
    public void CreateNewCustomer(Customer c)
    {
       //CRUD and business logic here
       ...
       db.SaveChanges();
    }
    public Customer GetCustomerWithHistory(int customerId)
    {
       db.Customer.Include("SalesOrders").FirstOrDefault( c => c.Id = customerId);
    }

    public void CreateCustomerServiceTicket(Customer c, Incident i)
    {
    }
}

请注意,这应该是业务服务,而不是存储库。

【讨论】:

  • 谢谢,所以我可以为所有表创建一个类(如果这样做有意义的话)并遵循上面的模式?我用谷歌搜索了一个业务服务与一个存储库,并确保我们的术语相同,您是否将其称为具有接口?
  • 查看更新业务服务与存储库的示例。这个想法是服务处理所有存储库操作用于处理客户服务交互的域逻辑。
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2020-02-11
  • 2011-04-27
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多