我有一个 WPF 应用程序,遵循模型视图视图模型模式,使用实体框架与 SQL 2008 数据库进行交互。
问题:
我的问题是我无法使用 EF 更改数据库中的外键值。我有两个实体:站点和密钥。一个站点上可以有许多键。我想将密钥从一个站点移动到另一个站点。我正在尝试使用以下代码执行此操作:
keyToMove.Site = newSite;
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges();
我观察到的
它显示在内存中一切都很好,因为应用程序的其余部分反映了这一变化(密钥将出现在新站点下)。但是,数据库中的外键不会更改,并且在关闭并重新启动应用程序时,所有更改都会丢失。
在“keyToMove.Site = newSite;”之后,keyToMove、newSite 和旧的 Site 实例都有一个 EntityState 值“Unchanged”,这是不可能的。SaveChanges 也返回 2,这让我更加困惑。
“站点”属性的设置器实现看起来像我模型中的其他导航属性:
set
{
((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value;
}
SQL Profiler 显示没有任何类似于 UPDATE 的内容被发送到 db 引擎,只有一个非常非常长的 SELECT。
可能有影响的事情
“键”实体根据应用于其中一列的条件从另一个实体继承。
我正在使用 AutoFac IOC 容器来提供任何想要通过引用我的数据访问类的实例(示例中的“dataAccess”)进行数据访问的 ViewModel。
ObjectContext 实例是此类的成员(在注释中显示为“this.entities”)。
dataAccess 实例是单例范围的,因此视图模型之间应该只共享一个实例,“keyToMove”和“newSite”都附加到相同的上下文。
很抱歉这篇文章的长度,但我真的不知道这里发生了什么,我试图提供尽可能多的细节,这可能会有所帮助。请询问是否有任何进一步的信息会有所帮助。
提前致谢。