当通过导航器将新实体添加到已经存在的实体时,我遇到了实体框架4的问题。请看一下代码:
            ControlPolicy cp1 = new ControlPolicy()
            {
                ControlPolicyLevelType = 2, //full access to NA
                MemberState = context.Countries.First(tt => tt.IsMemberState),
                OperaModuleType = 2,
                MemberStateIncluded = true,
                CreateDate = DateTime.Now,
                CreatedByUserId = 1,
            };
            context.ControlPolicies.AddObject(cp1);
            context.SaveChanges();错误是:
来自“ControlPolicy_MemberState_Country_”AssociationSet的关系处于“添加”状态。考虑到多重限制,相应的“国家”也必须处于“附加”状态。
当我查看ChangeTracker时,ControlPolicy对象实际上处于“添加”状态,而国家对象处于“未定义”状态。我认为这是正确的--毕竟我没有增加一个新的目标,我只想提到现有的国家。
发布于 2013-12-11 16:53:17
在这种情况下,错误的EF模型是错误的。MemberState与国家是1-1的关系,因此对于EF,很明显,当ControlPolicy被添加时,还必须定义一个新的MemberState ( Country )。一旦导航器关系被更改为适当的m:1,MemberState:Country,一切都开始工作了。
另外,我觉得瑞雅林巴FK的建议很好。尽管这不是这里的问题,也不适用于我的情况,因为使用了ChangeTracker。显然,ChangeTracker不会知道通过FK所做的改变。然而,在任何其他情况下,使用外键都是非常方便和有用的。
发布于 2013-12-11 10:33:54
我认为问题在于MemberState = context.Countries.First(tt => tt.IsMemberState) statement.Few statement.Few中的Linq查询与Find语句中发生的相同错误。通过Google,我找到了适合我的解决方案。
 var zz= context.ControlPolicy.Create().GetType().GetProperty("MemberState").GetValue(cp1);
 context.Entry(dmm.Set<ControlPolicy>().Find(entityKey)).CurrentValues.SetValues(cp1);
 context.SaveChanges();发布于 2013-12-11 11:07:20
我认为这将解决你的问题,我可能有错误的想法,但从错误信息,我会尝试如下:-
var country = context.Countries.First();
ControlPolicy cp1 = new ControlPolicy()
            {
                Country = country,
                ControlPolicyLevelType = 2, 
                MemberState = country.IsMemberState,
                OperaModuleType = 2,
                MemberStateIncluded = true,
                CreateDate = DateTime.Now,
                CreatedByUserId = 1,
            };
            context.ControlPolicies.AddObject(cp1);
            context.SaveChanges();https://stackoverflow.com/questions/20516212
复制相似问题