如何在C#/EF Core中创建基于这样的类结构的数据库?

问题描述 投票:0回答:1

有这样一个类结构:

使用这样的结构,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);
    }
}

无论如何我都遇到了同样的错误。有没有什么办法解决这一问题?我需要,在专家系统的本质上,将带有操作的链接分成块。

c# postgresql entity-framework entity-framework-core
1个回答
0
投票

这应该可以解决您的问题:

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);
}

数据库图:

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.