Инициализация сущности с конструкторами в EF Core

public class Context : DbContext
{
  public Context()
  {
    Database.EnsureCreated();
  }

  public DbSet<User> Users { get; set; }
}

public class User : EntityBase
{
  private User(int id, DateTime createdDate)
  {
    Id = id;
    CreatedDate = createdDate;
  }

  public User(string name, string email, string password)
  {
    // проверка на null

    Name = name;
    Email = email;
    Password = password;
  }

  public int Id { get; }
  public DateTime CreatedDate { get; }
  public string Name { get; set; }
  public string Email { get; set; }
  public string Password { get; set; }
}

Вот в чем проблема: при инициализации сущности User нужно, чтоб вызывался первый конструктор, но вызывается второй. Как через Fluent API указать какой конструктор использовать при инициализации сущности?


Ответы (1 шт):

Автор решения: Alexey Kurtov

Так как ваши поля Id и CreatedDate объявлены как readonly, то EF Core их в целом не видит и не будет маппить. Исправить это можно указав сопоставление свойств:

public class Context : DbContext
{
  public Context ()
  {
    Database.EnsureCreated ();
  }

  public DbSet<User> Users { get; set; }

  protected override void OnModelCreating (ModelBuilder modelBuilder)
  {
    modelBuilder.Entity<User> (
      b =>
      {
        b.HasKey (e => e.Id);
        b.Property (e => e.CreatedDate);
      });
  }
}

Если это не поможет добавьте в приватный конструктор все поля:

public class User : EntityBase
{
  private User (int id, string name, string email, string password, DateTime createdDate)
  {
    Id = id;
    CreatedDate = createdDate;
    Name = name;
    Email = email;
    Password = password;
  }

  public User (string name, string email, string password) : this (default, name, email, password, default)
  {
    // проверка на null
  }

  public int Id { get; }
  public DateTime CreatedDate { get; }
  public string Name { get; set; }
  public string Email { get; set; }
  public string Password { get; set; }
}
→ Ссылка