2010-04-23 1 views
2

У меня есть объект проекта с несколькими дочерних таблиц, например ProjectAwards ProjectTeamMemberПринимая снимок (клонирование) проекта с использованием Linq 2 Sql

Я хотел бы, чтобы скопировать данные из проекта (и дочерних таблиц) в новый Запись проекта и обновление статуса проекта.

например

var projectEntity = getProjectEntity(projectId); 

draftProjectEntity = projectEntity 
draftProjectEntity.Status = NewStatus 

context.SubmitChanges(); 

Я нашел эту ссылку from Marc Gravell

Его часть пути там, но он обновляет дочерние записи к новому draftProject, где мне нужно его скопировать.

ответ

1

К сожалению, что вы здесь делаете, задайте переменную draftProjectEntity ссылкой на объект projectEntity. То есть, они теперь указывают на один и тот же объект. Что вам нужно сделать, это глубокий клон из projectEntity.

There are ways of doing this with Reflection - если вы собираетесь это сделать, то я настоятельно рекомендую вы изучите этот метод.

Однако, если ваш будет только один уровень, или только для небольшого графа объектов, то это может быть стоит просто делать это вручную и реализации собственного 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; 

Для получения информации о том, почему я не использую интерфейс ICloneable для этого ... проверьте эту тему: Should I provide a deep clone when implementing ICloneable?

+0

спасибо за ответ, я нашел и увидел похожие реализации для клонирования, я надеялся, что будет часть Linq 2 SQL магия, которая будет делать это для меня по строкам псевдо-кода вопроса. – JoeBlogs1999