使用这样的结构,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; }
}
尝试创建数据库时,出现错误:
System.InvalidOperationException:“无法确定 导航“专家”表示的关系 “List”类型的“System.CompletionOperations”。要么手动配置 关系,或使用“[NotMapped]”忽略此属性 属性或通过使用 'EntityTypeBuilder.Ignore' ‘OnModelCreating’。”
然后我尝试通过OnModelCreating()方法进行配置:
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);
}
}
无论如何我都遇到了同样的错误。有没有什么办法解决这一问题?我需要,在专家系统的本质上,将带有操作的链接分成块。
这应该可以解决您的问题:
public class ExpertSystem
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Operation> InitialOperations { get; set; }
public virtual ICollection<Operation> CompletionOperations { get; set; }
public virtual ICollection<Operation> VariablesOperations { get; set; }
}
public class Input
{
public int Id { get; set; }
public string Type { get; set; }
public string Text { get; set; }
public Variable Variable { get; set; }
public int VariableId { get; set; }
}
public class Output
{
public int Id { get; set; }
public string Text { get; set; }
public Variable? Variable { get; set; }
public int? VariableId { get; set; }
}
public class Operation
{
public int Id { get; set; }
[NotMapped]
public ExpertSystem ExpertSystem { get; set; }
public int ExpertSystemId { get; set; }
}
public class Variable
{
public int Id { get; set; }
public string Name { get; set; }
}
然后:
public partial class ApplicationDBContext : DbContext
{
public ApplicationDBContext() {
Database.EnsureDeleted();
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("data source=(LocalDb)\\MSSQLLocalDB;initial catalog=ExpertSystem;integrated security=True;");
}
}
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; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.InitialOperations)
.WithOne()
.HasForeignKey(e => e.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.CompletionOperations)
.WithOne()
.HasForeignKey(e => e.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ExpertSystem>()
.HasMany(e => e.VariablesOperations)
.WithOne()
.HasForeignKey(o => o.ExpertSystemId)
.OnDelete(DeleteBehavior.Cascade);
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
数据库图: