Инициализация сущности с конструкторами в 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; }
}