C# 实体框架4添加一个引用已有对象的实体
当通过navigator向现有实体添加带有引用的新实体时,EntityFramework4有一个问题。请看一下代码:C# 实体框架4添加一个引用已有对象的实体,c#,.net,entity-framework,C#,.net,Entity Framework,当通过navigator向现有实体添加带有引用的新实体时,EntityFramework4有一个问题。请看一下代码: ControlPolicy cp1 = new ControlPolicy() { ControlPolicyLevelType = 2, //full access to NA MemberState = context.Countries.First(tt =>
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\u MemberState\u Country\u”关联的关系处于“Added”状态。给定多重性约束,相应的“国家”也必须处于“添加”状态
当我查看ChangeTracker时,ControlPolicy对象实际上处于“已添加”状态,而Country one处于“未定义”状态。我认为这是正确的-毕竟我没有添加新对象,我只想引用现有的国家/地区。我认为问题在于
MemberState=context.Countries.First(tt=>tt.IsMemberState)
语句中的Linq查询。几天前,我在Find Linq语句中发生了相同的错误。通过谷歌,我找到了适合我的解决方案
var zz= context.ControlPolicy.Create().GetType().GetProperty("MemberState").GetValue(cp1);
context.Entry(dmm.Set<ControlPolicy>().Find(entityKey)).CurrentValues.SetValues(cp1);
context.SaveChanges();
var zz=context.ControlPolicy.Create().GetType().GetProperty(“MemberState”).GetValue(cp1);
context.Entry(dmm.Set().Find(entityKey)).CurrentValues.SetValues(cp1);
SaveChanges();
我认为这将解决您的问题,我可能有错误的想法,但从错误消息中,我会尝试以下方法:-
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();
在这种特殊情况下,错误发生在错误的EF模型中。MemberState和Country是1-1关系,因此对于EF来说,很明显,当添加ControlPolicy时,还必须定义一个新的MemberState(Country)。一旦导航器关系更改为正确的m:1 MemberState:Country,一切都开始工作
此外,我觉得Rui Jarimba FK的建议非常好。尽管这不是这里的问题,而且由于使用了ChangeTracker,所以不适用于我的情况。显然,ChangeTracker不知道通过FK进行的更改。但是,在任何其他情况下,使用外键都非常方便和有用。您是否有MemberStateId属性(外键)?尝试设置该属性,而不是设置关联。不,我没有这样的属性,只有导航器。你应该将外键添加到模型中,这将在将来为你省去很多麻烦。看到了吗,我想是的,IsMemberState,是国家表中的一个财产吗?德里克,是的,没错。