Можно ли сохранить такую совокупность классов в БД C#+EF?
В общем, есть вот такая структура:
Используя такую структуру EF не позволяет мне создать базу данных, так как в сущности ExpertSystem три свойства одного и того же типа, на примерном коде будет понятнее: Сущности:
public class ExpertSystem
{
public int Id { get; set; }
public string Name { get; set; }
public List<Operation> InitialOperations { get; set; }
public List<Operation> CompletionOperations { get; set; }
public List<Operation> 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; }
}
При попытке создать БД вылетел Exception:
System.InvalidOperationException: "Unable to determine the relationship represented by navigation 'Expert System.CompletionOperations' of type 'List'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'." Попробовал настроить через метод
OnModelCrating()
:
public class ApplicationDbContext : DbContext
{
public DbSet<ExpertSystem> ExpertSystems { get; set; }
public DbSet<Operation> Operations { get; set; }
public DbSet<Output> Outputs { get; set; }
public DbSet<Input> Inputs { get; set; }
public DbSet<Variable> Variables { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.InitialOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.CompletionOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.VariablesOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
}
}
Все равно та же ошибка. Можно как нибудь это исправить? Мне необходимо в сущности экспертной системы разделить связи с операциями на блоки.