C# 使用Linq 2 Sql拍摄项目的快照(克隆)
我有一个具有多个子表的项目实体,例如ProjectAwards ProjectTeamMember 我想将项目(和子表)中的数据复制到新的项目记录中,并更新项目状态 乙二醇 我找到了这个链接C# 使用Linq 2 Sql拍摄项目的快照(克隆),c#,linq-to-sql,cloning,C#,Linq To Sql,Cloning,我有一个具有多个子表的项目实体,例如ProjectAwards ProjectTeamMember 我想将项目(和子表)中的数据复制到新的项目记录中,并更新项目状态 乙二醇 我找到了这个链接 这是其中的一部分,但它会将子记录更新到新的draftProject,我需要它在其中进行复制。不幸的是,您在这里所做的是将变量draftProjectEntity设置为对projectEntity对象的引用。也就是说,它们现在指向同一个对象。您需要做的是深入克隆projectEntity -如果你打算经常这样
这是其中的一部分,但它会将子记录更新到新的draftProject,我需要它在其中进行复制。不幸的是,您在这里所做的是将变量
draftProjectEntity
设置为对projectEntity
对象的引用。也就是说,它们现在指向同一个对象。您需要做的是深入克隆projectEntity
-如果你打算经常这样做-那么我强烈建议你研究一下这种方法
然而,如果您只需要深入一层,或者只需要一个小的对象图,那么简单地手工操作并在您的实体上实现您自己的IDeepCloneable可能是值得的
public interface IDeepCloneable<T>
{
T DeepClone();
}
public class Person : IDeepCloneable<Person>
{
public string Name { get; set; }
public IList<Address> Addresses { get; set; }
public Person DeepClone()
{
var clone = new Person() { Name = Name.Clone().ToString() };
//have to make a clone of each child
var addresses = new List<Address>();
foreach (var address in this.Addresses)
addresses.Add(address.DeepClone());
clone.Addresses = addresses;
return clone;
}
}
public class Address : IDeepCloneable<Address>
{
public int StreetNumber { get; set; }
public string Street { get; set; }
public string Suburb { get; set; }
public Address DeepClone()
{
var clone = new Address()
{
Street = this.Street.Clone().ToString(),
StreetNumber = this.StreetNumber, //value type - no reference held
Suburb = this.Suburb.Clone().ToString()
};
return clone;
}
}
//usage:
var source = personRepository.FetchByName("JoeBlogs1999");
var target = source.DeepClone();
//at this point you could set any statuses, or non cloning related changes to the copy etc..
targetRepository.Add(target);
targetRepository.Update;
public接口IDeepCloneable
{
T深克隆();
}
公共类人员:IDeepCloneable
{
公共字符串名称{get;set;}
public IList感谢您的回答,我已经找到并看到了类似的克隆实现,我希望有一个Linq 2 SQL魔术可以按照伪问题代码的思路为我实现。
public interface IDeepCloneable<T>
{
T DeepClone();
}
public class Person : IDeepCloneable<Person>
{
public string Name { get; set; }
public IList<Address> Addresses { get; set; }
public Person DeepClone()
{
var clone = new Person() { Name = Name.Clone().ToString() };
//have to make a clone of each child
var addresses = new List<Address>();
foreach (var address in this.Addresses)
addresses.Add(address.DeepClone());
clone.Addresses = addresses;
return clone;
}
}
public class Address : IDeepCloneable<Address>
{
public int StreetNumber { get; set; }
public string Street { get; set; }
public string Suburb { get; set; }
public Address DeepClone()
{
var clone = new Address()
{
Street = this.Street.Clone().ToString(),
StreetNumber = this.StreetNumber, //value type - no reference held
Suburb = this.Suburb.Clone().ToString()
};
return clone;
}
}
//usage:
var source = personRepository.FetchByName("JoeBlogs1999");
var target = source.DeepClone();
//at this point you could set any statuses, or non cloning related changes to the copy etc..
targetRepository.Add(target);
targetRepository.Update;