实体框架/ .Net 4.0:POCO并保存多对一关系

时间:2009-10-27 15:19:03

标签: entity-framework .net-4.0

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

非常简单,我有一个广告和一个广告类型,其中有一个广告到一个广告类型。 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是 持有/有身份证。
  • 正确设置了AdType属性。
  • AdTypeId为0.
  • 数据库中存在外键关系。
  • AdTypeId是主键。
  • 我将延迟/延迟加载设置为true

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

1 个答案:

答案 0 :(得分:4)

好的看起来好像是因为我使用的是非代理(使那个词起来......呀)“基于快照的更改跟踪”方法,系统并没有真正意识到它已经改变了。

  

在这个例子中,Customer是纯粹的   POCO类型。与EntityObject或   基于IPOCO的实体,进行更改   到实体不会自动   保持州经理同步,因为   没有自动通知   你的纯POCO实体和   实体框架。因此,在   它认为,询问州经理   客户对象状态是   即使我们有,也不会改变   明确地改变了其中一个   实体上的属性。

Got that from here

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

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

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