C# 实体框架4添加一个引用已有对象的实体

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 =>

当通过navigator向现有实体添加带有引用的新实体时,EntityFramework4有一个问题。请看一下代码:

            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,是国家表中的一个财产吗?德里克,是的,没错。