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
Ответы
Ответ 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;
Ответ 3
Отъезд http://www.codeproject.com/KB/architecture/attachobjectgraph.aspx
Это потрясающее решение и может помочь вам понять, что автор также имеет обновленную версию в своем собственном блоге - http://www.codetuning.net/blog/post/Entity-Framework-reattaching-entity-graphs-(3).aspx
Пол
Ответ 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);
}
}