1

Я использую EntityFramework Core, Code First и Fluent Апи определить базу данных модели, и я следить за конъюнктурой о стратегии наследования карты:Mapping наследования в EntityFramework Ядра

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. Каковы лучшие практики для отображения модели базы данных? Тип-Per-Hyerarchy или Table-Per-Type? Учитывая, что для многих, TPT, как правило, является анти-шаблоном и приводит к существенным проблемам с производительностью позже. согласно EF issues #2266

    a. Если TPH, как использовать поле дискриминатора для многих типов?

    b. Если TPT, как использовать эту стратегию в EF Core 1.0?

  2. Является ли это лучшей архитектурой для бизнес-модели?

спасибо за внимание и сотрудничество

ответ

1

я смотрел в это короткое время, играя с ядром EF, будучи использованы для EF6, и широко используется таблица на тип.

1a) Мое впечатление, что сопоставления по умолчанию очень хорошо, если вы просто добавляете каждый тип сущности в качестве DbSet в свой контекст. При необходимости, то вы можете настроить это в OnModelBuilding переопределения в вашем DbContext:

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

1b) В настоящее время вы не можете использовать TPT с ядром EF. Он запланирован для будущих выпусков и в настоящее время указан как Высокий приоритет на EF core roadmap

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; } 
} 

Эти entitites затем будут храниться в отдельных таблицах, с ВНЕШНЯЯ-отношения с ключевыми между ними. Переход сотрудника на клиента также будет заключаться в создании нового клиента с тем же свойством пользователя, что и сотрудник, например.

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(); 
} 
+0

Спасибо за ваш ответ Алекс, но я намерен рассмотреть подклассы как уникальное Лицо, когда меняет значения как «информация о контактах» в одной уникальной точке. –

Смежные вопросы