2011-02-03 6 views
1

Я пытаюсь создать экземпляр объекта Entity Framework с помощью отражения:Невозможно создать экземпляр рамочного объекта объекта с помощью отражения

var type = Type.GetType("MyAssembly.MyEntityNamespace.MyEntity"); 
var target = Activator.CreateInstance(t); 

я использовал этот код раньше, и он всегда работал большим на «регулярном ", но когда я использую его на объектах EF в этом решении, GetType() возвращает null. Моя модель EF находится в отдельном проекте, и этот код выполняется в своей собственной модульной тестовой сборке. Испытательный узел делает ссылкой на сборку EF и сборку EF, которая входит в/bin.

Я могу создать экземпляр классов EF нормально, но даже эта попытка отражения не работает:

var item = new MyEntity();    //works fine 
Type.GetType(item.GetType().FullName); //null 
Type.GetType(item.GetType().Name);  //null 

Я не уверен, если это EF вещь или справочный проект вещь. Почему я не могу создать новый экземпляр этого объекта, используя простое отражение, когда я могу легко создать объект без отражения?

ответ

3

Поскольку контекст EF находится в другой сборке, вам необходимо предоставить имя, соответствующее сборке, а не просто пространство имен и имя-типа.

Узел-квалифицированное имя выглядит примерно так:

"MyAssembly.MyEntityNamespace.MyEntity, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 

Если вы используете System.Web, есть также класс BuildManager, который имеет некоторые утилиты для более легко идентифицировать классы в зависимости от их имени:

Type type = BuildManager.GetType("MyAssembly.MyEntityNamespace.MyEntity", false, true); 
+1

http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx – Reddog

+0

Теперь кажется очевидным, что вы упомянули об этом. Я дам ему шанс и немного откликнуться. – Jeff

+0

Вот и все. Ему не понравилось полное имя с версией, культурой и токеном открытого ключа, но «MyAssembly.MyNamespace.MyEntity, MyAssembly» работал. Спасибо! – Jeff