无法使用反射创建实体框架对象的实例

发布于 2024-10-16 07:40:36 字数 639 浏览 2 评论 0原文

我正在尝试使用反射创建实体框架对象的实例:

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 事物还是项目引用事物。当我可以在不使用反射的情况下如此轻松地创建对象时,为什么我无法使用简单的反射来创建该对象的新实例?

I am trying to create an instance of an Entity Framework object using reflection:

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

I have used this code before and it has always worked great on "regular" objects but when I use it on EF objects in this solution, GetType() returns null. My EF model is in its own separate project and this code is executing in its own unit testing assembly. The test assembly does reference the EF assembly and the EF assembly is making it into the /bin.

I can create instance of the EF classes normally but even this attempt at reflection does not work:

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

I'm not sure if this is an EF thing or a project reference thing. Why aren't I able to create a new instance of this object using simple reflection when I can create the object so easily without reflection?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里兽 2024-10-23 07:40:36

由于 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);

Since the EF context is in a different assembly, you'll need to provide the assembly-qualified name, rather than just the namespace and typename.

The assembly-qualified name looks something like this:

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

If you are using System.Web, there is also a BuildManager class that has some utilities for more easily identifying classes based on their name:

Type type = BuildManager.GetType("MyAssembly.MyEntityNamespace.MyEntity", false, true);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文