实体框架/.Net 4.0:POCO 并保存多对一关系
-
06-07-2019 - |
题
我必须如何设置一个属性,以便在使用 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);
它有效。希望我理解正确...
不隶属于 StackOverflow