我无法获得对同一个类/表的2个引用

时间:2012-03-06 21:04:35

标签: c# entity-framework ef-code-first code-first

我有以下问题:

我有2个类,我不想先用代码来生成数据库。

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属性指向它的初始状态。

但无论我尝试什么,我都不会让它发挥作用。我已经使用了数据注释,流畅的api和foreignkey属性,但仍然遇到如下问题:

“无法确定依赖操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。”

为了使这更加有趣,我还希望初始状态是图表类的状态之一。

有人可以帮帮我吗?

更新:

我找到了一块拼图:

代码第一个框架尝试创建2个表 图表:列 - &gt; Id,Initial_Id
州:有栏目 - &gt; Id,Name,Chart_Id

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

嗯...

2 个答案:

答案 0 :(得分:0)

这只是一个黑暗的镜头,但你认为这与两个类的属性(可能是你想要的主键)有一个名为id的guid这一事实有关吗?将它重命名为StateId和ChartId怎么样?如果不出意外,我认为这只是更好的命名实践......

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

答案 1 :(得分:0)

EF当前无法完全按照您的编写方式执行此映射,因为它最终会出现循环依赖关系和数据库生成的密钥的组合,无法确定更新/插入顺序。

但是,在这些行之间进行读取,我将假设可能在多个图表实体之间共享状态实体。换句话说,多个图表可以指向同一个州。在这种情况下,你真正拥有的是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实体相关联,那么你需要找出其他的东西 - 可能有解决方法使这个工作,但不像上面的解决方案那么容易。