添加子项时创建的父对象的新实例

时间:2015-12-04 10:09:24

标签: c# asp.net-mvc asp.net-mvc-5 parent-child

我创建了一个将子属性复制到父属性的函数。让我的父类为A,其中有许多类B的孩子。我正在向A添加子项,这些子项已经是其他父项的子项(复制子类的实例以避免输入值的额外开销)。我创建了一个CopyProperty函数,它将父ID和选定ChildInstances列表作为参数。

发布方法

 public ActionResult CopyProperty(TechnicalCharacteristic model, int[] setid)
 {
    var req_tcset = new List<TcSet>();
    foreach(var item in setid)
        req_tcset.Add(db.TcSet.FirstOrDefault(x => x.TcSetID == item));
    foreach(var item in req_tcset)
    {
        if (!model.TcSets.Any(x => x.TcSetID == item.TcSetID))
        {
           var add = new TcSet { TechnicalCharacteristic = model, TechnicalCharacteristicID = model.TechnicalCharacteristicID };
           add.SetName = item.SetName;
           add.DescriptionDE = item.SetName;
           db.TcSet.Add(add);
           db.SaveChanges();
        }
   }

当我保存子类时,也会使用传递的模型的相同值创建相同的父类对象。我希望将子项添加到父类而不是父类的新实例。

DB的其他信息

在数据库中,父级的ID也更改为新的型号ID。我真的无法理解为什么会发生这种情况。调用CopyProperty的父类的子节点将被删除并分配给新父节点,其父节点的所有详细信息与原始父节点相同。但最后我有父母的多份副本。

1 个答案:

答案 0 :(得分:1)

因为你在这行代码中创建了模型:

new TcSet { TechnicalCharacteristic = model, TechnicalCharacteristicID = model.TechnicalCharacteristicID };

您应该使用Attach()让EF知道它是现有对象,或者只是从您的数据库中获取实际模型:

new TcSet { 
   TechnicalCharacteristic = db.TechnicalCharacteristics.FirstOrDefault(x => x.Id == model.Id), 
   TechnicalCharacteristicID = model.TechnicalCharacteristicID 
};

如果你有父母属性的Id,最好这样做:

new TcSet { 
       TechnicalCharacteristicID = model.TechnicalCharacteristicID 
    };