我创建了一个将子属性复制到父属性的函数。让我的父类为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
的父类的子节点将被删除并分配给新父节点,其父节点的所有详细信息与原始父节点相同。但最后我有父母的多份副本。
答案 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
};