繁体   English   中英

在实体框架中更改关系/外键-不保留

[英]Changing a relationship / foreign key in Entity Framework - not being persisted

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

问题

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

keyToMove.Site = newSite;
dataAccess.SaveChanges(); // this method just does: this.entities.SaveChanges();

我观察到的

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

在“ keyToMove.Site = newSite;”之后,keyToMove,newSite和旧的Site实例都具有EntityState值“ Unchanged”,这是不正确的。 SaveChanges也返回2,这让我更加困惑。

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

set
{
    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Site>("CmsModel.SiteKeyAssociation", "Site").Value = value;
}

SQL Profiler显示没有类似于UPDATE的内容发送到db引擎,只有非常长的SELECT。

可能会产生影响的事物

“键”实体基于应用于列之一的条件从另一个实体继承。

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

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

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

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

提前致谢。

我正在自学实体框架的过程,因此我可能遗漏了您的问题,当然也不是专家。 但是,话虽如此,您可能会遇到我不得不自己解决的问题。

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

这将不起作用:

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

相反,您可以执行以下操作:

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

希望我能理解您的问题!

问候,迈克

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM