EF Core не может определить отношение, представленное внешними ключами в абстрактном классе - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь реализовать абстрактный класс для объектов CRUD, который содержит две ссылки на класс User;один для пользователя, который создал объект, и другой для пользователя, который последний раз его изменял. Платформа сущностей не может определить взаимосвязь, представленную навигационными свойствами CreatedBy и ModifiedBy для наследующего их класса (Department). Потенциальная дополнительная сложность заключается в том, что класс User также имеет свойство класса Department, которое не связано со свойствами CreatedBy и ModifiedBy в Department.

Ниже приведено сообщение об ошибке:

Невозможно определить отношение, представленное свойством навигации «Department.CreatedBy» типа «Пользователь». Либо настройте отношение вручную, либо игнорируйте это свойство с помощью атрибута «[NotMapped]» или с помощью «EntityTypeBuilder.Ignore» в «OnModelCreating».

Я использую dotnet 3.0 и EF Core 3.0

Я пытался настроить различные атрибуты данных ForeignKey и использовать Fluent API, следуя документации EF, но мне не удалось заставить их работать.

public class User
{
    [Key]
    public int Id { get; set; }
    public Department Department { get; set; } = null!;
}

public class Department : AbstractCrudObject
{

}

public abstract class AbstractCrudObject
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("CreatedByUserId")]
    public User CreatedBy { get; set; } = null!;
    public int CreatedByUserId { get; set; }

    [ForeignKey("ModifiedByUserId")]
    public User ModifiedBy { get; set; } = null!;
    public int ModifiedByUserId { get; set; }
}


public class AppDbContext : DbContext
{
    public virtual DbSet<User> Users { get; set; } = null!;
    public virtual DbSet<Department> Departments { get; set; } = null!;
    public AppDbContext()
    {
    }

    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

1 Ответ

1 голос
/ 15 октября 2019

Потенциальная дополнительная сложность заключается в том, что класс User также имеет свойство класса Department, которое не связано со свойствами CreatedBy и ModifiedBy в Department.

В этом проблема - EF Coreне знает, связаны ли они, или это относится к одному из них (и к какому именно), поэтому вы должны настроить это явно, используя свободный API.

Минимальный минимум - указать свойства множественности и навигации для требуемых отношений - в этом случае 3 отношения «многие к одному» со ссылочным свойством навигации на зависимых сторонах и без свойства навигации коллекции на главных концах:

modelBuilder.Entity<User>()
    .HasOne(e => e.Department)
    .WithMany();

modelBuilder.Entity<Department>()
    .HasOne(e => e.CreatedBy)
    .WithMany();

modelBuilder.Entity<Department>()
    .HasOne(e => e.ModifiedBy)
    .WithMany();
...