更改实体框架中的关系/外键 - 不会被持久化

时间:2009-08-06 03:39:02

标签: c# entity-framework foreign-keys relationship

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

问题

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

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事件探查器显示没有类似UPDATE的内容被发送到数据库引擎,只有非常非常长的SELECT。

可能产生影响的事情

“Key”实体基于应用于其中一列的条件从另一个实体继承。

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

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

dataAccess实例是Singleton Scoped,因此在View Models e.i中只应该共享一个实例。 “keyToMove”和“newSite”都附加在同一个上下文中。

对不起这篇文章的篇幅,但我真的不知道这里发生了什么,我试图提供尽可能多的细节。请询问是否有任何其他信息可以提供帮助。

提前致谢。

1 个答案:

答案 0 :(得分: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;

我希望我理解你的问题!

此致 麦克