代码之家  ›  专栏  ›  技术社区  ›  stovroz

在Linq to SQL中,为什么分配相关实体会创建变更集插入?

  •  3
  • stovroz  · 技术社区  · 15 年前

    为什么下面的代码要向DataContent变更集中添加一个Insert(新地址的Insert),如何阻止它这样做?

    var db = new DataClasses1DataContext();
    var a = new Address();
    a.StateProvince = db.StateProvinces.First();
    Console.WriteLine(db.GetChangeSet().Inserts.Count);
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Amy B    15 年前

    地址a=新地址();

    db.StateProvinces.First();

    这将加载StateProvince的实例。实例由加载它的datacontext(db)跟踪。db正在等待来自此实例的更改通知。

    a、 州省=

    这是一项财产转让。如果检查自动生成的属性“StateProvince”,您将看到它还更新StateProvince实例上的相关属性“Addresses”。现在StateProvince实例已更改。这将导致通知db,结果是db现在跟踪address实例作为一个新的、准备插入的实例。

    最简单的解决方法是,在使用db之前,设置:

    db.ObjectTrackingEnabled = false;
    

    另一方面,var就像热狗一样棒。

        2
  •  2
  •   Brian Mains    15 年前

    因为数据上下文知道州省的情况,所以它会自动将地址排队等待插入。只要你不提交,地址就永远不会被创建。此外,要解决此问题,请设置:

    Address.StateProvinceID = db.StateProvinces.First().StateProvinceID;
    

    如果您可以在没有直接对象引用的情况下工作。除了通过plinko,没有直接的方法将LINQ中的实体分离到SQL( http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1 ).

        3
  •  1
  •   Coding Flow    15 年前

    它这样做是因为您正在检索一个“StateProvince”,并将新地址上的外键设置为现有的StateProvince,因为地址是新的,那么更改集将为它构建一个insert,因为我怀疑您通过不必要地将新地址添加到StateProvince实体上的Addresses集合来更改state province。您可以尝试从关联中删除子属性,因为在州省实体上拥有关联地址的集合可能没有用。

    DataClasses1DataContext db = new DataClasses1DataContext();
    db.ObjectTrackingEnabled = false;
    Address a = new Address();
    a.StateProvince = db.StateProvinces.First();
    

    您可能还注意到我已经删除了您对var的公然滥用;-)