搞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
谢谢回复,不过这篇文章只是示例,对我这个问题没有帮助。
查了资料,这种问题属于entity framework circular dependency。
因为两个实体相互引用,那么在新增时,就不确定到底要先生成哪个记录,以满足外键的需求。所以只有两种解决办法:
1、想办法避免这种引用。
2、调用两次SaveChanges,以保证其中一条记录不是新增状态。但这种方法很差,不能满足事务要求。