2015-09-03 4 views
0

У меня естьКак обновить объекты в DbContext без знания их точного типа?

object elementToUpdate; 

и я хочу, чтобы обновить его в моем DbContext.

Это кажется хорошей отправной точкой

public void Update<TEntity>(TEntity entity) 
{ 
    DbContext.Set<TEntity>().Attach(entity); 
    DbContext.Entry(entity).State = EntityState.Modified; 
    DbContext.SaveChanges(); 
} 

, как описано here

Моя проблема в том, что я не могу бросить свою elementToUpdate должным образом. Я знаю, что название это точный тип как строку (например, "MyEntityType"), но я не знаю, как бросить его с помощью отражения - или, другими словами, как вставить Type-Parameter

DbContext.Set<MyEntityType>() 

из строки

"MyEntityType" 

Благодарим за помощь.

+1

у вас есть MyEntityType в вашем коде. Если у вас есть возможность использовать фабричный шаблон. – Arash

+0

Вам действительно нужно его бросить, или вы просто не знаете тип во время компиляции? Если вы просто вызываете 'Update (elementToUpdate)' (без указания '', он должен автоматически выбрать правильный общий тип для вашего шаблона на основе этого параметра. – LInsoDeTeh

+0

@LInsoDeTeh, если объект помещен в поле с «объектом», тогда метод вызываемый 'TEntity', равный' object', не нужный тип. –

ответ

1

Вы всегда можете использовать не общая версия DbContext.Set:

DbContext.Set(ObjectContext.GetObjectType(entity.GetType()))

Вы не можете использовать только entity.GetType(), потому что это может быть прокси. Вот почему нужен System.Data.Entity.Core.Objects.ObjectContext.

+0

Я обожаю переполнение стека, и я люблю тебя :) –

0

Использовать другую Set перегрузки, которая не является универсальной и принимает тип объекта в качестве входных данных, при условии, у вас есть сборки квалифицированного имени типа объекта (если тип в исполняемой в данный момент сборки, имени типа квалифицирован его имен достаточно):

public void Update(object entity, string typeName) 
{ 
    var type = Type.GetType(typeName); 
    DbContext.Set(type).Attach(entity); 
    DbContext.Entry(entity).State = EntityState.Modified; 
    DbContext.SaveChanges(); 
} 
Смежные вопросы