1

我有一个 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”都附加到相同的上下文。

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

提前致谢。

4

1 回答 1

1

我正在自学实体框架,所以我可能错过了你的问题的重点,而且我当然不是专家。但是,话虽如此,您可能会遇到一个我必须自己解决的问题。

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

这将不起作用:

NewSite = Site.CreateSite("PrimaryKeyValue");
keyToMove.Site = NewSite;

相反,你做这样的事情:

NewSite = MyEntities.Site.Where(site=>site.PrimaryKey==PrimaryKeyValue)
                                .FirstOrDefault();
keyToMove.Site = NewSite;

我希望我理解你的问题!

问候,迈克

于 2009-08-08T04:54:21.540 回答