Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改实体框架中的关系/外键-未持久化_C#_Entity Framework_Foreign Keys_Relationship - Fatal编程技术网

C# 更改实体框架中的关系/外键-未持久化

C# 更改实体框架中的关系/外键-未持久化,c#,entity-framework,foreign-keys,relationship,C#,Entity Framework,Foreign Keys,Relationship,我有一个WPF应用程序,遵循模型-视图-模型模式,使用实体框架与SQL 2008数据库交互 问题: 我的问题是我无法使用EF更改数据库中的外键值。我有两个实体:Site和Key。一个站点上可以有许多键。我想将密钥从一个站点移动到另一个站点。我正在尝试使用以下代码执行此操作: keyToMove.Site = newSite; dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges(); 我所观察

我有一个WPF应用程序,遵循模型-视图-模型模式,使用实体框架与SQL 2008数据库交互

问题

我的问题是我无法使用EF更改数据库中的外键值。我有两个实体:Site和Key。一个站点上可以有许多键。我想将密钥从一个站点移动到另一个站点。我正在尝试使用以下代码执行此操作:

keyToMove.Site = newSite;
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges();
我所观察到的

它显示在内存中一切正常,因为应用程序的其余部分反映了这一变化(该键将显示在新站点下)。但是,数据库中的外键不会更改,关闭并重新启动应用程序后,所有更改都将丢失

在“keyToMove.Site=newSite;”之后,keyToMove、newSite和旧站点实例的EntityState值均为“Unchanged”,这是不正确的。另外,SaveChanges返回2,这让我更加困惑

“站点”属性的setter实现与我的模型中的其他导航属性类似:

set
{
    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value;
}
set
{
((全局::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference(“CmsModel.SiteKeyAssociation”,“Site”).Value=Value;
}
SQL事件探查器显示,不会向db引擎发送任何类似于更新的内容,只会发送非常非常长的SELECT

可能产生影响的事情

“键”实体根据应用于其中一列的条件从另一个实体继承

我正在使用AutoFac IOC容器提供任何想要通过引用我的数据访问类的实例来进行数据访问的ViewModels(示例中为“dataAccess”)

ObjectContext实例是此类的成员(在注释中显示为“this.entities”)

dataAccess实例是单例范围的,因此视图模型之间应该只共享一个实例,即“keyToMove”和“newSite”都附加到同一上下文

对不起,这篇文章太长了,但我真的不知道这里发生了什么,我试图提供尽可能多的细节,这可能会有所帮助。请询问是否有任何进一步的信息会有所帮助


提前感谢。

我正在自学实体框架,所以我可能没有抓住你问题的重点,当然也不是专家。然而,尽管如此,你可能遇到了一个问题,我必须自己解决

您没有在创建“newSite”变量的地方发布代码,但在EF中设置外键时,您的做法不同于在Linq中或仅在数据库中工作。使用EF,您必须在外键值中选择要在对象上设置的值,然后进行设置

这是行不通的:

NewSite = Site.CreateSite("PrimaryKeyValue");
keyToMove.Site = NewSite;
相反,您可以这样做:

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue)
                                .FirstOrDefault();
keyToMove.Site = NewSite;
我希望我理解你的问题

问候,,
Mike

我正在自学实体框架,所以我可能没有抓住你问题的重点,我当然不是专家。然而,尽管如此,你可能遇到了一个问题,我必须自己解决

您没有在创建“newSite”变量的地方发布代码,但在EF中设置外键时,您的做法不同于在Linq中或仅在数据库中工作。使用EF,您必须在外键值中选择要在对象上设置的值,然后进行设置

这是行不通的:

NewSite = Site.CreateSite("PrimaryKeyValue");
keyToMove.Site = NewSite;
相反,您可以这样做:

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue)
                                .FirstOrDefault();
keyToMove.Site = NewSite;
我希望我理解你的问题

问候,,
Mike

通过yourModel.Designer.cs中的属性setter进行调试,并确保调用了此.ReportPropertyChanged()。事实并非如此,setter实现看起来与其他导航属性类似,请参见上面的编辑…啊,这里的头发快用完了,如果您对此处可能发生的情况有任何想法,请通过yourModel.Designer.cs中的属性setter进行后期调试,并确保调用了此.ReportPropertyChanged()。事实并非如此,setter实现看起来与其他导航属性类似,请参见上面的编辑…啊,这里的头发很快就用完了,请如果你有任何想法可能会发生在这里,请张贴这是真的;EF将只更新其认为已更改的属性。如果从数据库中具体化keyToMove,这是自动的。如果您自己创建了新站点,则必须在附加到上下文之前设置旧站点,才能检测到更改;EF将只更新其认为已更改的属性。如果从数据库中具体化keyToMove,这是自动的。如果您自己创建了新站点,则必须在附加到上下文之前设置旧站点,以便检测更改。