
Используя такую структуру, EF не позволяет мне создать базу данных, так как в сущности ExpertSystem есть три свойства одного типа, в примере кода будет понятнее:
Сущности:
Код: Выделить всё
public class ExpertSystem
{
public int Id { get; set; }
public string Name { get; set; }
public List InitialOperations { get; set; }
public List CompletionOperations { get; set; }
public List VariablesOperations { get; set; }
}
public class Input : Operation
{
public string Type { get; set; }
public string Text { get; set; }
public Variable Variable { get; set; }
public int VariableId { get; set; }
}
public class Output : Operation
{
public string Text { get; set; }
public Variable? Variable { get; set; }
public int? VariableId { get; set; }
}
public class Operation
{
public int Id { get; set; }
public ExpertSystem ExpertSystem { get; set; }
public int ExpertSystemId { get; set; }
}
public class Variable
{
public int Id { get; set; }
public string Name { get; set; }
}
System.InvalidOperationException: «Невозможно определить
отношения, представленные навигацией «Expert
System.CompletionOperations» типа «List». Либо вручную настройте
отношения, либо игнорируйте это свойство с помощью атрибута «[NotMapped]»
или с помощью EntityTypeBuilder.Ignore в
OnModelCreating».
Затем я попытался настроить его с помощью метода OnModelCreating():
Код: Выделить всё
public class ApplicationDbContext : DbContext
{
public DbSet ExpertSystems { get; set; }
public DbSet Operations { get; set; }
public DbSet Outputs { get; set; }
public DbSet Inputs { get; set; }
public DbSet Variables { get; set; }
public ApplicationDbContext(DbContextOptions options) : base(options)
{
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(e => e.InitialOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasMany(e => e.CompletionOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasMany(e => e.VariablesOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... -c-ef-core
Мобильная версия