2009-07-21 2 views
30

Я только начал использовать Entity Framework, а не мой обычный NHiberante, чтобы увидеть, как работает EF, и до сих пор у меня много проблем, но в частности это отключение объекта и сохранение связанные дочерние объекты.
Я купил книгу O'Reilly Entity Framework, в которой говорится: «Да, структура сущности по умолчанию не сохраняет граф объекта при отсоединении», но она не показывает, как вы храните график! Спасибо 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

ответ

24

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

т.е.

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

(Program Manager Entity Framework Team)

+0

Это здорово спасибо Алекса MergeOption сделал трюк для, но проблема в том, без отсоединения моего метод обновления не работает, так или иначе вокруг этого? Использование (var creativeWorkshopEntities = new CreativeWorkshopEntities()) { { if (job.Id> 0) creativeWorkshopEntities.AttachОбновлен (работа); // Пользовательский метод размножения еще creativeWorkshopEntities.AddToJob (job); creativeWorkshopEntities.SaveChanges(); } – 2009-07-22 07:34:09

+0

Вам необходимо использовать ApplyPropertyChanges (...), проходящую в обновленном объекте. ApplyPropertyChanges (обновлено) копирует значения из «обновленного» объекта в исходный объект. Чтобы это работало, «исходный» объект должен быть в контексте, либо потому, что вы держались за копию и прикрепляли ее (рекомендуется), либо потому, что вы выполнили запрос на повторную загрузку из базы данных. –

+6

Есть ли способ предотвратить измельчение графа сущности? Почему отстраняется от реализации этого пути? – Den

2

Отъезд http://www.codeproject.com/KB/architecture/attachobjectgraph.aspx

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

Пол

+0

Это похоже на действительно отличное решение! –

0

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

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); 
      } 
    } 
+2

Это отделяет только один объект, а не весь график. –

+0

@ DannyVarod Почему вы так думаете? Я только что пробовал это, и он работает так, как ожидалось, все сущности существуют. – veljkoz

+0

@veljkoz Встроенный отсоединитель от EF4 отделяет только один объект, эта реализация клонирует объект. Я не могу вспомнить, почему я написал это - прошло более года назад, и я не вижу никаких изменений. –

3

В 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; 
Смежные вопросы