Рассмотрим следующее:
public class BaseEntity
{
public Guid CreatedBy { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public Guid ModifiedBy { get; set; }
public DateTimeOffset ModifiedOn { get; set; }
}
public class User : BaseEntity
{
public Guid UserId { get; set; }
public string Email { get; set; }
public ICollection<Company> Companies { get; set; }
}
public class Company : BaseEntity
{
public Guid CompanyId { get; set; }
public string Name { get; set; }
[ForeignKey("UserId")]
public User User { get; set; }
}
После того, как я создал первую миграцию и посмотрел таблицы в SQL, я понял свойство навигации User
(и все модели, имеющие одинаковый FK) является избыточным, потому что он всегда будет равен Id свойства CreatedBy
. Я попытался установить отношения между User
и BaseEntity
на основе этого ответа (также удалил User
FK из модели Company
), но безуспешно.
Ошибка:
Невозможно определить отношение, представленное свойством навигации «Company.CreatedBy» типа «Пользователь». Либо настройте отношение вручную, либо игнорируйте это свойство с помощью атрибута [NotMapped] или с помощью EntityTypeBuilder.Ignore в OnModelCreating.
Модели:
public class BaseEntity
{
public Guid CreatedById { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public Guid ModifiedById { get; set; }
public DateTimeOffset ModifiedOn { get; set; }
[ForeignKey("CreatedById")]
public User CreatedBy { get; set; }
[ForeignKey("ModifiedById")]
public User ModifiedBy { get; set; }
}
public class User : BaseEntity
{
public Guid UserId { get; set; }
public string Email { get; set; }
public ICollection<Company> Companies { get; set; }
}
public class Company : BaseEntity
{
public Guid CompanyId { get; set; }
public string Name { get; set; }
}
Есть ли правильный способ, которым я могу выполнить sh это?
Вариант B - сохранить исходные модели и не использовать навигацию по свойствам CreatedBy
/ ModifiedBy
и запрашивать пользователя при необходимости.