代码之家  ›  专栏  ›  技术社区  ›  Programmin Tool

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

  •  1
  • Programmin Tool  · 技术社区  · 15 年前

    如何设置一个属性,以便在使用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();
    

    此时出现问题,它试图将0值保存在adtypeid列中(导致外键问题),而不是使用对象分配的adtype属性来确定应将其插入adtypeid列中的内容。

    我知道的事情:

    • 此时someadtype是 保留/具有ID。
    • ADTYPE属性设置正确。
    • ADtypeID为0。
    • 数据库中存在外键关系。
    • ADtypeID是主键。
    • 我已将延迟/延迟加载设置为“真”

    自从adtype被设置为允许延迟加载以来,我还没有真正尝试过更改它。

    1 回复  |  直到 15 年前
        1
  •  4
  •   Programmin Tool    15 年前

    好吧,看起来是因为我用的是非代理(编造的那个词…是的,“基于快照的变更跟踪”方法,系统不知道它发生了什么变化。

    在本例中,客户是 POCO类型。与EntityObject或 基于ipoco的实体,进行更改 实体不会自动 使状态管理器保持同步,因为 没有自动通知 在你纯粹的Poco实体和 实体框架。因此,在 它认为,询问国家经理 客户对象状态为 即使我们有 明确更改了 实体的属性。

    Got that from here

    所以为了确保它知道要检查是否有变化,我必须使用 AcceptAllChangesAfterSave 带有savechanges方法的选项。

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

    它起作用了。希望我能正确理解…