【问题标题】:Changing a relationship / foreign key in Entity Framework - not being persisted更改实体框架中的关系/外键 - 不被持久化
【发布时间】: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


【解决方案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;

希望我能理解你的问题!

问候, 迈克

【讨论】:

  • 这是真的; EF 只会更新它认为已经改变的属性。如果您从数据库实现 keyToMove,那是自动的。如果您自己新建它,则必须在附加到上下文之前设置旧站点,以便检测到更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2011-08-19
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多