Сохранить детей вместе с родителем linq в sql

У меня есть две таблицы Rule и RuleCondition (одна -> много).

люди могут добавлять условия в любое время.

Предположим, изначально он добавляет два условия. Он может вернуться и добавить другое условие, а также может обновить уже добавленные условия.

Я могу сохранить обновленные условия, но не могу вставить дополнительное условие, которое он добавил. Ниже мой код, и он терпит неудачу в

rule.RuleConditions.Add(oRuleCon); -- Entity set was modified during enumaration

Если я использую подход

oAngieCtxt.RuleConditions.InsertOnSubmit(oRuleCon);

это вовсе не вставка данных.

Может кто-нибудь посоветовать, как справиться?

public ActionResult saveMetricRule(Rule rule)
    {
        bool IsNew = rule.RuleId == 0;

        using (NewAngieDataContext oAngieCtxt = new NewAngieDataContext(new CSConfigurationMgr().GetConnectionString(ConnectionStringKey.Angie)))
        {
            if (IsNew)
                oAngieCtxt.Rules.InsertOnSubmit(rule);
            else
            {
                RuleCondition oRuleCon = null;
                foreach (RuleCondition childItem in rule.RuleConditions)
                {
                    if (childItem.RuleConditionId == 0)
                    {
                        oRuleCon = new RuleCondition();
                        oRuleCon.Points = childItem.Points;
                        oRuleCon.ConditionValue = childItem.ConditionValue;
                        oRuleCon.ToOperatorId = childItem.ToOperatorId;
                        oRuleCon.Sort = childItem.Sort;
                        rule.RuleConditions.Add(oRuleCon);
                  //   oAngieCtxt.RuleConditions.InsertOnSubmit(oRuleCon);
                    }
                    else
                    {
                        oRuleCon =
                            oAngieCtxt.RuleConditions
                            .Where(CON => CON.RuleConditionId == childItem.RuleConditionId)
                            .FirstOrDefault();

                        oRuleCon.Points = childItem.Points;
                        oRuleCon.ConditionValue = childItem.ConditionValue;
                        oRuleCon.ToOperatorId = childItem.ToOperatorId;
                        oRuleCon.Sort = childItem.Sort;
                    }
                }

                oAngieCtxt.Rules.Attach(rule);
                oAngieCtxt.Refresh(RefreshMode.KeepCurrentValues, rule);
            }
            oAngieCtxt.SubmitChanges();
        }

        return this.Json(new
        {
            msg = "Successful save.",
            ruleId = rule.RuleId
        });
    }

1 ответ

Решение

Вы не можете добавить элемент в список, который вы перечисляете. Так как вы перебираете rule.RuleConditionsВы не можете добавить к нему внутри foreach петля. Вместо этого вы можете добавить во временный список, а затем добавить все элементы из этого списка в rule.RuleConditions после foreach,

var newRuleConditions = new List<RuleCondition>();
foreach (RuleCondition childItem in rule.RuleConditions)
{
  if (childItem.RuleConditionId == 0)
  {
    oRuleCon = new RuleCondition();
    oRuleCon.Points = childItem.Points;
    oRuleCon.ConditionValue = childItem.ConditionValue;
    oRuleCon.ToOperatorId = childItem.ToOperatorId;
    oRuleCon.Sort = childItem.Sort;
    //add to temporary list
    newRuleConditions.Add(oRuleCon);
    oAngieCtxt.RuleConditions.InsertOnSubmit(oRuleCon);
  }
  else
  {
    ...
  }
}
//add all new rule conditions
rule.RuleConditions.AddRange(newRuleConditions);
Другие вопросы по тегам