我必须如何设置一个属性,以便在使用 SaveChanges 时保存多对一关系,但我没有得到:INSERT 语句与 FOREIGN KEY 约束冲突...错误。

很简单,我有一个广告和一个 AdType,其中一个 AdType 有很多广告。Ad 上有一个属性:

public class Ad
{
   public Int32 AdTypeId { get; set; }
   public virtual AdType AdType { get; set; }
}

为了掩盖这种关系。

当我这样做时:

someAd.AdType = someAdType;

该属性设置得很好,但 AdTypeId 却没有设置。不过不用担心,因为我认为这可以保存。

context.SaveChanges();

问题是,此时它正在尝试保存 AdTypeId 列中的 0 值(导致外键问题),而不是使用分配 AdType 属性的对象来确定应插入 AdTypeId 列中的内容。

我所知道的事情:

  • 此时,Someadtype持续/具有ID。
  • AdType 属性设置正确。
  • AdTypeId 为 0。
  • 数据库中存在外键关系。
  • AdTypeId 是主键。
  • 我已将延迟/延迟加载设置为 true

我还没有真正尝试过更改 AdType,因为它被设置为允许延迟加载。

有帮助吗?

解决方案

好吧,看起来是因为我使用的是非代理(这个词是我写的......是的)“基于快照的更改跟踪”方法,系统并不真正知道它已更改。

在此示例中,Customer 是纯 POCO型。与 EntityObject 或 基于IPOCO的实体,正在做出改变 到实体不会自动 使状态管理器保持同步,因为 没有自动通知 在您的纯 POCO 实体和 实体框架。因此,在 查询状态管理器,它会认为 客户对象状态为 即使我们有 显式地对 实体上的属性。

从这里得到的

因此,为了确保它知道检查是否有更改,我必须使用 保存后接受所有更改 SaveChanges 方法的选项。

context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);

它有效。希望我理解正确...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top