代码之家  ›  专栏  ›  技术社区  ›  Matthew Kruskamp

LinqToSql用内部类C重写插入#

  •  2
  • Matthew Kruskamp  · 技术社区  · 16 年前

    我有一个基础食谱类,我正在使用数据上下文。我在datacontext中重写了配方的insert方法,并试图将其插入到其子项中。无论我做什么,我都无法让孩子插入。目前,只有配方插入,孩子没有任何反应。

        partial void InsertRecipe(Recipe instance)
        {
            // set up the arrays
            for (int x = 0; x < instance.PlainIngredients.Count; ++x)
            {
                instance.TextIngredients.Add(new TextIngredient()
                {
                    StepNumber = x + 1,
                    Text = instance.PlainIngredients[x]
                });
            }
    
            this.ExecuteDynamicInsert(instance);
        }
    

    我已经尝试了我能想到的一切。我甚至在方法中实例化了另一个数据上下文,在实例从ExecuteDynamicInsert返回id后,我尝试添加它,但遇到了超时错误。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Matthew Kruskamp    16 年前

    我想通了。覆盖DataContext中的SubmitChanges,并查找所有作为配方的插入和更新。运行算法在那里添加孩子。

        public override void SubmitChanges(
            System.Data.Linq.ConflictMode failureMode)
        {
            ChangeSet changes = this.GetChangeSet();
    
            var recipeInserts = (from r in changes.Inserts
                           where (r as Recipe) != null
                           select r as Recipe).ToList<Recipe>();
    
            var recipeUpdates = (from r in changes.Updates
                           where (r as Recipe) != null
                           select r as Recipe).ToList<Recipe>();
    
            ConvertTextData(recipeInserts);
            ConvertTextData(recipeUpdates);
    
            base.SubmitChanges(failureMode);
        }
    
        2
  •  1
  •   DamienG    16 年前

    InsertX/UpdateX/DeleteX方法是在LINQ to SQL确定哪些对象将包含在SubmitChanges中后调用的。

    使用两个DataContext时,您可能会遇到超时,这很可能是因为两个事务之间的锁定问题。

    我无法清楚地看出你在这里想要实现什么——通常LINQ to SQL会管理子关系本身——什么是PlainIngredients和TextIngredients?