在通过导航器将引用添加到现有实体的新实体时,我遇到了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处于“未定义”状态。我认为这是正确的 - 毕竟我不添加新对象,我只想引用现有国家。
答案 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所做的更改。但是在任何其他情况下,使用外键都非常方便和有用。