我有一个名为Person的实体类。 Person实体有一个Asset实体列表。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public IList<Asset> Assets { get; set;}
}
例如我有两个人(person1&amp; person2)。我需要将资产列表从person1复制到person2。我喜欢以下代码:
Person person1 = LoadById(1);
Person person2 = LoadById(2);
// person2.Assets = person1.Assets; // Is it correct?
foreach(Asset item in person1.Assets)
{
//person2.Assets.Add(item);
Asset asset = new Asset();
asset.Title = item.Title;
asset.Description = item.Description;
asset.Person = person2;
person2.Add(asset);
}
person2.Update();
有更好的方法吗?
答案 0 :(得分:3)
Assets
属性是对列表的引用。 person2.Assets = person1.Assets;
意味着他们共享并指向同一个列表,因此不会分开。
你想这样做:
person2.Assets = new List<Asset>(person1.Assets);
(只是要检查那个重载,但是应该复制所有的内容)......是的,应该这样做。
如果您想添加它们而不是替换它们,请使用:
person2.Assets.AddRange(person1.Assets);
但是,您可能会获得重复项。如果您不想这样做,可以执行此操作:Linq to entities : Unions + Distinct
此外,您还有一个()
- 您的第一行应该是public class Person
。
答案 1 :(得分:0)
作为起点,我推荐MemberwiseClose method。
的MSDN文档这将使您的复制过程更具可读性。但请注意,这也只会创建列表的浅副本。
如果你真的需要一个深副本,那么文章会建议这个策略:
如果有多种方法可以实现深层复制操作 由MemberwiseClone方法执行的浅复制操作 不符合你的需求。其中包括以下内容:
调用要复制的对象的类构造函数,以创建第二个对象,其属性值取自第一个对象。这个 假设对象的值完全由其类定义 构造
调用MemberwiseClone方法创建对象的浅表副本,然后分配值与其对应的新对象 原始对象为其值为引用的任何属性或字段 类型。示例中的DeepCopy方法说明了这种方法。
序列化要深度复制的对象,然后将序列化数据还原到其他对象变量。
使用带递归的反射来执行深层复制操作。