实体框架4添加实体,引用现有对象

时间:2013-12-11 10:09:02

标签: c# .net entity-framework

在通过导航器将引用添加到现有实体的新实体时,我遇到了Entity Framework 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对象实际上处于“已添加”状态,而Country 1处于“未定义”状态。我认为这是正确的 - 毕竟我不添加新对象,我只想引用现有国家。

3 个答案:

答案 0 :(得分:0)

我认为问题出在MemberState = context.Countries.First(tt => tt.IsMemberState)语句中的Linq查询。几天后,我发现查找Linq语句出现了同样的错误。通过谷歌我找到了适合我的解决方案

 var zz= context.ControlPolicy.Create().GetType().GetProperty("MemberState").GetValue(cp1);

 context.Entry(dmm.Set<ControlPolicy>().Find(entityKey)).CurrentValues.SetValues(cp1);
 context.SaveChanges();

答案 1 :(得分:0)

我认为这会解决您的问题,我可能有错误的想法,但是从错误信息我会尝试这个: -

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();

答案 2 :(得分:0)

在这种特殊情况下,错误是在错误的EF模型中进行的。 MemberState和Country是1-1关系,因此对于EF来说很明显,当添加ControlPolicy时,还必须定义新的MemberState(Country)。一旦导航器关系更改为正确的m:1 MemberState:国家一切都开始工作。

此外我发现Rui Jarimba FK的建议非常好。虽然这不是问题,但由于使用了ChangeTracker,它在我的情况下不适用。显然,ChangeTracker不会知道通过FK所做的更改。但是在任何其他情况下,使用外键都非常方便和有用。

相关问题