首页 新闻 赞助 找找看

关于EF的实体双向关联的问题

0
悬赏园豆:100 [已解决问题] 解决于 2013-08-13 21:39

搞EF映射时遇到一个问题:

考虑工作流场影:ProcessDefinition类有Nodes属性,包含多个流程节点,同时有一个StartState属性用来标识哪个是开始节点。

类图如下:

 

通过使用FluentAPI将Node和StartState存在BPM_Node表中;将ProcessBlock与ProcessDefinition放到BPM_ProcessBlock表中。

以下为创建实体的测试代码:

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var p = new ProcessDefinition();
            p.Nodes = new System.Collections.Generic.List<Node>();
            p.ID = Guid.NewGuid();
            var s = new StartState();            
            s.ID = Guid.NewGuid();
            p.Nodes.Add(s);
            s.ProcessBlock = p;
            s.ProcessDefinition = p;
            p.StartState = s;
            context c = new context();
            c.Processes.Add(p);

            try
            {
                c.SaveChanges();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

 

在创建ProcessDefinition对象时,报异常:Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values

我分析是因为存在双向外键引用,即BPM_Node表中有外上用了ProcessBlock,而ProcessBlock中又有外键引用了BPM_Node。

 

我的测试项目:http://pan.baidu.com/share/link?shareid=1446789229&uk=3271842158

吴东雷的主页 吴东雷 | 初学一级 | 园豆:104
提问于:2013-08-13 15:42
< >
分享
最佳答案
0
收获园豆:100
小兵仔 | 小虾三级 |园豆:1240 | 2013-08-13 17:25

谢谢回复,不过这篇文章只是示例,对我这个问题没有帮助。

吴东雷 | 园豆:104 (初学一级) | 2013-08-13 20:00
其他回答(1)
0

查了资料,这种问题属于entity framework circular dependency。

因为两个实体相互引用,那么在新增时,就不确定到底要先生成哪个记录,以满足外键的需求。所以只有两种解决办法:

1、想办法避免这种引用。

2、调用两次SaveChanges,以保证其中一条记录不是新增状态。但这种方法很差,不能满足事务要求。

吴东雷 | 园豆:104 (初学一级) | 2013-08-13 21:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册