Как клонировать сущность POCO и добавить ее в контекст - PullRequest
1 голос
/ 14 октября 2010

Я использую EF4, и у меня есть объекты POCO с прокси из моей структуры базы данных.У меня есть POCO (объект), который имеет много связей с другими объектами.

Я создал глубокую копию объекта, используя DataContractSerializer и BinaryFormatter, и позвольте ему вызвать его clonedObject.

функция, используемая для клонированияis:

public T CloneProxy<T>(T source)
{
  var dcs = new System.Runtime.Serialization
     .DataContractSerializer(typeof(T));
  string filePath = "Initiative.txt";

  using (FileStream file = new FileStream(filePath, FileMode.Create))
  {
    (new BinaryFormatter()).Serialize(file, source);
  }

  context.CreateProxyTypes(new Type[] { typeof(Initiative) });

  using (FileStream file = new FileStream(filePath, FileMode.Open))
  {
    return (T)(new BinaryFormatter()).Deserialize(file);
  }

}

Теперь, когда у меня есть clonedObject, как мне добавить его в контекст?как мне добавить его в базу данных?

мой объект (просто дать вам идею инициативы POCO):

Initiative
{   
InitI   
InitName    
<collection>Comments
}    
Comments    
{    
CommentI    
<FK>InitI   
}

Вот некоторые из моих действий и ошибки, которые яполучили.

cloneInit.InitI = 0;

    Data_Business.RQRMComment[] arr = new Data_Business.RQRMComment[1];

    arr = cloneInit.RQRMComments.ToArray();

    for (int x = 0; x < arr.Length; x++) //each (var x in cloneInit.RQRMComments)
    {
      RQRMComment thisC = arr[x];
      int y = thisC.InitI;
      thisC.InitI = 0;
      thisC.ID = 0;
    } 
    Context.AddObject("Initiatives", cloneInit); 
    Context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);

Ошибка:

ex = {"Невозможно добавить или присоединить объект, поскольку его EntityReference имеет значение свойства EntityKey, которое не соответствует EntityKey дляэтот объект. "}

Пожалуйста, помогите, я потратил слишком много времени на это.Спасибо.

1 Ответ

3 голосов
/ 20 ноября 2010

У меня была необходимость клонировать мои сущности с целью повторного отображения данных в форме, чтобы пользователь мог выбрать «Создать и добавить похожие», чтобы уменьшить количество усилий, необходимых пользователю для потратить, чтобы добавить ряд похожих предметов в мою БД.

Я проверил несколько вариантов, включая рефлексию и сериализацию, но они запутались в том, что я пытаюсь достичь, затем я обнаружил, что могу преодолеть проблему «XYZ является частью ключевой информации объекта и не может быть изменена» - т.е. установите первичный ключ моей сущности на 0 после вставки (Сохранить изменения) - со следующим кодом:

MyDbEntities bb = new MyDbEntities();

 //Add & Save new entry
 db.Product.AddObject(product);
 db.SaveChanges();

 //Reset entity
 db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Added);
 product.ProductId = 0;
...