2009-10-27 134 views
1

如何设置属性,以便在使用SaveChanges时保存多对一关系,并且不会导致:INSERT语句冲突与FOREIGN KEY约束...错误。实体框架/ .Net 4.0:POCO并保存多对一关系

很简单,我有一个广告和一个广告类型,其中有很多广告到一个AdType。广告上有一个物业:

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因为它被设置为允许延迟加载。

回答

4

好吧,看起来像是因为我使用的是非代理的(Made that word up ... Yah)“基于快照的变更跟踪”方法,系统并没有真正意识到它已被更改。

在此示例中,客户是纯粹的 POCO类型。不像EntityObject或 基于IPOCO实体,进行更改 到实体不会自动 保持状态管理器保持同步,因为 有你的纯POCO实体和 实体框架之间没有自动通知 。因此,当 查询状态管理器时,它认为 客户对象状态为 即使我们有 明确地对实体上的 属性之一进行了更改,也不会改变。

Got that from here

因此,为了确保它知道要检查,看看是否出现了变化我不得不使用AcceptAllChangesAfterSave选项与SaveChanges方法。

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

和它的作品。希望我的理解正确...

+1

嘿,我面临同样的问题,并试图用这个选项保存没有成功。据我所知,AcceptAllChangesAfterSave不会尝试检测更改,而只会在保存后调用AcceptChanges(),使实体保持Unchanged状态。如我错了请纠正我。 – 2010-05-24 06:35:45