Подтвердить что ты не робот

Entity Framework - отделить и сохранить связанный граф объектов

Я только начал использовать Entity Framework, а не мой обычный NHiberante, чтобы увидеть, как работает EF, и до сих пор у меня много проблем, но в частности это удаление объекта и сохранение связанных дочерних объектов.
Я купил книгу O'Reilly Entity Framework, в которой говорится: "Да, структура сущности по умолчанию не сохраняет граф объекта при отсоединении", но она не показывает, как вы храните график! Спасибо O'Reilly, что действительно полезно.

В любом случае, если кто-то может помочь, это будет здорово, код ниже:

        using (var creativeWorkshopEntities = new CreativeWorkshopEntities())
        {
            var q = from c in creativeWorkshopEntities.Job.Include("Files")
                    where c.Id == jobId
                    select c;

            var job = q.First();

            creativeWorkshopEntities.Detach(job);

            return job;
        }

Спасибо!

Dan

4b9b3361

Ответ 1

Попробуйте вместо этого использовать запрос NoTracking. Таким образом, объекты arenever прилагаются, поэтому вам не нужно "отсоединять", что есть, когда граф измельчается:

то есть.

using (var creativeWorkshopEntities = new CreativeWorkshopEntities())        
{            
    creativeWorkshopEntities.Job.MergeOption = MergeOption.NoTracking;
    var q = from c in creativeWorkshopEntities.Job.Include("Files")
            where c.Id == jobId                    
            select c;            
    var job = q.First();            
    return job;
} 

Надеюсь, что это поможет

Алекс

(Team Framework Entity Framework Team)

Ответ 2

В EF5 MergeOption больше не находится на уровне DbSet. Поэтому в соответствии с этим: http://msdn.microsoft.com/en-us/data/hh949853.aspx

Если вы хотите выполнить запрос не отслеживания, вам нужно будет сделать что-то вроде:

  var q = from c in creativeWorkshopEntities.Job.AsNoTracking().Include("Files")
                        where c.Id == jobId
                        select c;

Ответ 4

используйте код ниже для сохранения связанных объектов в памяти.

  using (var creativeWorkshopEntities = new CreativeWorkshopEntities())
  {
                var q = from c in creativeWorkshopEntities.Job.Include("Files")
                        where c.Id == jobId
                        select c;

                var job = q.First();

                return (Job)Detach(job);
   }

  private Object Detach(Object object)
  {
            using (var stream = new MemoryStream())
             {
                var formatter = new BinaryFormatter();
                formatter.Serialize(stream, dbo);
                stream.Position = 0;
               return formatter.Deserialize(stream);
             }
   }