Linq to Entities: добавить объект без сохранения изменений - PullRequest
4 голосов
/ 30 августа 2011

Давайте предположим, что у меня есть следующий код:

TEModule teModule = Context.TEModules.Where(module => module.EnumValue.Equals(text.ModuleName)).FirstOrDefault();
if (teModule == null)
{
     teModule = new TEModule();
     teModule.EnumValue = text.ModuleName;
     Context.TEModules.AddObject(teModule);
     //Context.SaveChanges();
     TEModule aux = Context.TEModules.Where(module => module.EnumValue.Equals(teModule.ModuleName)).FirstOrDefault();
}

Моя проблема в том, что если я оставлю комментарий " SaveChanges ", то в следующем запросе объект aux всегда будет нулевымпотому что Context.TEModules пуст, даже когда я вызываю метод " AddObject ".Однако если я вызову SaveChanges после AddObject, то при следующем запросе вспомогательный объект не будет нулевым.Проблема в том, что я не хочу вызывать SaveChanges так часто, потому что это не единственный фрагмент кода, в который я добавляю объекты, и производительность снижается, если я это делаю.

ТакВопрос в том, должен ли я вызывать SaveChanges после каждого вызова AddObject, если позже мне нужно будет узнать, существует ли объект?

1 Ответ

5 голосов
/ 30 августа 2011

Цель запроса linq-to-entity - выполнить, и выполнение выполняется в базе данных, поэтому, если вы не сохранили объект, его представление в базе данных не существует.

Если вам нужно найти локально сохраненные сущности (еще не сохраненные), вы должны запросить ObjectStateManager.

var entity = Context.ObjectStateManager.GetObjectStateEntries(EntitiState.Added)
                                       .Where(e => !e.IsRelationship)
                                       .Select(e => e.Entity)
                                       .OfType<TEModule>()
                                       .FirstOrDefault(m => m.EnumValue.Equals(teModule.ModuleName));
...