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

dlinq-不带.insertonsubmit(…)插入的实体?

  •  2
  • Charles  · 技术社区  · 17 年前

    我在使用DLINQ时遇到了一个有趣的问题。当我实例化一个实体时,在DataContext上调用.SubmitChanges()将向数据库中插入一个新行-而从未调用过.Insert[All]OnSubmit(…)。

    //Code sample:
    Data.NetServices _netServices = new Data.NetServices(_connString);
    
    Data.ProductOption[] test = new Data.ProductOption[]
    {
            new Data.ProductOption
            {
                 Name="TEST1", 
                 //Notice the assignment here
                 ProductOptionCategory=_netServices.ProductOptionCategory.First(poc => poc.Name == "laminate")
            }
    };
    
        _netServices.SubmitChanges();
    

    运行上面的代码将在数据库中插入新行。我在编写解析XML文件并填充一些表的应用程序时注意到了这种效果。我注意到有1000多个插入,当时我只期望大约50个左右,然后我最终隔离了这个行为。

    如何防止这些对象被隐式持久化?

    谢谢, -查尔斯

    1 回复  |  直到 17 年前
        1
  •  2
  •   DamienG    17 年前

    把这种关系看成是有两面性的。设置关系的一侧时,需要更新另一侧,因此在上面的情况下,以及设置ProductOptionCategory时,它会有效地将新对象添加到层压板ProductOptionCategory侧的ProductOptions关系中。

    解决方法和您已经发现的一样,而是设置基础的外键,这样Linq to SQL将不会以通常的方式跟踪对象,并且需要隐式指示它应该持久化该对象。

    当然,性能的最佳解决方案是从源数据中确定哪些对象是您不想添加的,并且永远不会首先创建实例的。

    推荐文章