Entity Framework - отключение и сохранение графа связанных объектов - PullRequest
31 голосов
/ 21 июля 2009

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

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

        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

Ответы [ 4 ]

24 голосов
/ 22 июля 2009

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

т.е.

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;
} 

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

Alex

(команда Entity Framework Team Manager Program)

3 голосов
/ 17 октября 2012

В 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;
2 голосов
/ 01 августа 2009

Выезд http://www.codeproject.com/KB/architecture/attachobjectgraph.aspx

Это потрясающее решение, которое может помочь вам - учтите, что у автора есть обновленная версия и в его собственном блоге - http://www.codetuning.net/blog/post/Entity-Framework-reattaching-entity-graphs-(3).aspx

Пол

0 голосов
/ 30 июля 2010

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

  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);
             }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...