我可以';t获得对同一类/表的2个引用

本文关键字:一类 引用 2个 表的 我可以 | 更新日期: 2023-09-27 18:27:02

我有以下问题:

我有两个类,我不想首先与代码一起使用它们来生成数据库。

public class Chart
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public State Initial { get; set; }
    public virtual ICollection<State> States { get; set; }
}

public class State
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string Name { get; set; }
}

我还希望Chart类的Initial属性指向它的初始State。

但无论我做什么,我都不会成功。我使用了数据注释、fluent api和foreignkey属性,但一直遇到以下问题:

无法确定依赖操作的有效顺序。依赖项可能是由于外键约束、模型要求或存储生成的值而存在的。

为了让这更有趣,我还希望初始状态是chart类的状态之一。

有人能帮帮我吗?

更新:

我发现了一块拼图:

代码优先框架尝试创建2个表
图表:带列->Id,Initial_Id
状态:带列->Id,Name,Chart_Id

Chart.Initial_Id引用States表,State.Chart_Id引用Charts表。现在介绍了级联删除或插入等时的循环问题…

嗯。。。

我可以';t获得对同一类/表的2个引用

这只是一个未知数,但你认为这与两个类的属性(大概是你想要的主键)都有一个名为id的guid有关吗?将其重命名为StateId和ChartId怎么样?如果没有别的,我认为这只是更好的命名实践。。。

完整披露:我不使用CF EF,但只是偶然发现这是一个有趣的帖子

EF当前无法完全按照您编写的方式执行此映射,因为它最终包含循环依赖项和数据库生成的键,无法确定更新/插入顺序。

然而,从字里行间我会假设,也许国家实体应该在多个Chart实体之间共享。换句话说,多个图表可以引用同一个状态。在这种情况下,您真正拥有的是Chart和State之间的多对多关系,您可以覆盖OnModelCreating上下文来告诉EF这一点:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Chart>()
        .HasMany(s => s.States)
        .WithMany();
}

现在这样的东西会起作用:

using (var context = new ChartContext())
{
    var state1 = new State { Name = "State1" };
    var state2 = new State { Name = "State2" };
    var chart =
        new Chart
        {
            Initial = state1,
            States = new List<State> { state1, state2 }
        };
    context.Charts.Add(chart);
    context.SaveChanges();
}

正如您所看到的,Chart现在有一个初始状态和一个状态集合,初始状态是状态集合中的一个。

如果实际上每个State都与一个且唯一的Chart实体相关联,那么您需要找出其他方法——可能有一些变通方法可以实现这一点,但不如上面的解决方案那么容易。