关于c#:深度克隆对象后清除主键

Clearing primary keys after deep cloning an object

我有以下linq-to-sql对象(例如)

1
2
3
4
5
6
7
8
9
10
class Parent{
    int id; // primary key
    IEnumerable<Child> children;
}

class Child{
    int id; // primary key
    string field1;
    int field2;
}

我需要深度克隆一个Parent,并将其保存到数据库中,但使用子级的副本,即不引用现有的子级。

我已经使用这种方法进行了克隆,但是我正在寻找一种优雅的方法来迭代父对象和子对象属性(假设可能有大量子对象,层叠深度远远超过1级),并将它们的主键设置为0,以便当我将克隆的对象提交到数据库时,Linq to SQL会处理这些问题。创造新的孩子。


你可以试试以下的方法:用System.Reflection延伸。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static T DeepCopy<T>(this T parent) where T : new()
{
    var newParent = new T();
    foreach (FieldInfo p in typeof(T).GetFields())
    {
        if (p.Name.ToLower() !="id")
            p.SetValue(newParent, p.GetValue(parent));
        else
            p.SetValue(newParent, 0);
        if (p.FieldType.IsGenericType &&
            p.FieldType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        {
            dynamic children = p.GetValue(parent);
            dynamic newChildren = p.GetValue(parent);
            for (int i = 0; i < children.Length; i++)
            {
                var newChild = DeepCopy(children[i]);
                newChildren.SetValue(newChild, i);
            }
        }
    }
    return newParent;
}