我正在使用EntityFramework Core,Code First和Fluent Api來定義模型數據庫,並且我遵循了關於地圖繼承策略的情況:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class User : Person
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class Employee : Person
{
    public decimal Salary { get; set; }
}

public class Customer:Person
{
    public long DiscountPoints { get; set; }
}

業務邏輯

在這種情況下,用戶,員工和客戶都是人,但員工和客戶也是用戶,以及員工可以成為客戶。並且每種類型都用於不同的應用程序上下文中。

我以這種方式實現了不必要地使用來自其他應用程序上下文的值。

問題:

  1. 映射數據庫模型的最佳做法是什麼? Type-Per-Hyerarchy或Table-Per-Type?考慮到對於許多人來說, TPT通常是一種反模式,後來會導致嚴重的性能問題。根據EF問題#2266

    一個。如果是TPH,如何對多種類型使用鑑別器字段?

    灣如果是TPT,如何在EF Core 1.0中使用此策略?

  2. 它是商業模式的最佳架構嗎?

感謝您的關注與合作

熱門答案

我在使用EF核心時已經習慣了EF6,並且廣泛使用了每種類型的表格。

1a)我的經驗是,如果你只是將每個實體類型作為DbSet添加到你的上下文中,默認映射就會很好。如有必要,您可以在DbContext中的OnModelBuilding覆蓋中進行配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasDiscriminator<string>("person_type")
            .HasValue<Employee>("employee")
            .HasValue<Customer>("customer");
    }

1b)目前您不能將TPT與EF核心一起使用。它計劃在未來版本中使用,目前在EF核心路線圖中列為高優先級

2)如果我們採用嚴格的DDD原則,那麼業務層應盡可能地模擬/鏡像現實域,而不受應用程序數據層的影響。就個人而言,我認為上面提到的繼承是對現實生活情況的良好反映。然而,EF核心團隊似乎處於“贊成組合而不是繼承”陣營,這可能導致領域模型,例如:

public class Person
{
  public int Id { get; set; }
  public string Name { get; set; }
}

public class User
{
  public int Id {get;set;}
  public Person Person {get; set;}
  public int PersonId {get;set;}
  public string UserName { get; set; }
  public string Password { get; set; }
}

public class Employee
{
  public int Id {get; set;}
  public User User {get; set;}
  public int UserId {get;set;}
  public decimal Salary { get; set; }
}

public class Customer
{
  public int Id {get;set;}
  public User User {get; set;}
  public int UserId {get;set;}
  public long DiscountPoints { get; set; }
}

然後,這些權利將存儲在單獨的表中,它們之間具有外鍵關係。員工轉變為客戶也會涉及創建一個新客戶,具有與員工相同的用戶財產,例如

public void CreateCustomerFromEmployee(int employeeId) {
  var employee = context.Employees.Where(e => e.Id == employeeId).SingleOrDefault();

  context.Customers.Add(new Customer() 
    {
        UserId = employee.UserId,
        DiscountPoints = 0
    });

  context.SaveChanges();
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow