【发布时间】:2009-08-06 03:39:02
【问题描述】:
我有一个 WPF 应用程序,遵循模型视图 ViewModel 模式,使用实体框架与 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,这让我更加困惑。
“Site”属性的 setter 实现看起来像我模型中的其他导航属性:
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 实例是此类的成员(在 cmets 中显示为“this.entities”)。
dataAccess 实例是单例范围的,因此视图模型之间应该只共享一个实例,例如。 “keyToMove”和“newSite”都附加到同一个上下文。
很抱歉这篇文章的长度,但我真的不知道这里发生了什么,我试图提供尽可能多的细节,这可能会有所帮助。请询问是否有任何进一步的信息会有所帮助。
提前致谢。
【问题讨论】:
-
通过 yourModel.Designer.cs 中的属性设置器进行调试,并确保调用 this.ReportPropertyChanged()。
-
它没有,setter 实现看起来类似于其他导航属性,请参阅上面的编辑。
-
...呃,头发快用完了要拉出来,如果你知道这里会发生什么,请发帖
标签: c# entity-framework foreign-keys relationship