我在ASP.NET 4.0 Webforms应用程序中使用Entity Framework 4(数据库优先方法)。
我基本上做的是从我的ObjectContext
获取要编辑的实体,并显示用户应在网络表单上输入数据(或修改现有数据)的字段。
当时间存储数据时,我会从网络表单中读取值,构建一个新的Entity
实例,然后我有一个名为AddOrUpdate
的通用方法检测这是否是一个新实体(因此需要插入它),或者它是否是现有实体(因此需要更新现有数据)。
我的方法使用EntityKey
并检查对象上下文是否已经知道该对象 - 与他的博客帖子中的what Cesar de la Torre of Microsoft shows here非常相似:
public static void AddOrUpdate(ObjectContext context, EntityObject objectDetached)
{
if (objectDetached.EntityState == EntityState.Detached)
{
object currentEntityInDb = null;
if (context.TryGetObjectByKey(objectDetached.EntityKey, out currentEntityInDb))
{
// attach and update the existing entity
}
else
{
// insert new entity into entity set
context.AddObject(objectDetached.EntityKey.EntitySetName, objectDetached);
}
}
}
这工作得很好 - 时间最长。但是今天,突然之间,我突然在context.TryGetObjectByKey
声明中得到了这样的例外:
System.InvalidOperationException:找不到包含标识的类型' MyEntityType'
的对象映射
我根本不记得在这个核心代码中有任何改变 - 并且定义了实体类型,ID
中存储的EntityKey
值确实存在于数据库中。 .. 应该的一切都很好 - 但它一直让我失败......
这里到底发生了什么?
我确实找到了一些关于这个主题的博客和论坛帖子,但没有一个能真正启发我或帮助我解决这个问题。我一定搞砸了什么 - 不好 - 但是我真的看不到树林里的森林 - 任何提示?
答案 0 :(得分:1)
一般来说,当EF无法找到具有该类型的程序集时,就会发生这种问题。看到完全异常很难弄清楚,但似乎你最近的变化以及你使用EF的方式似乎是原因。
当必须使用上下文中的ObjectSet访问它时,EF通常直接从类型本身中选择类型。在调用上下文中没有类型的其他情况下,它会查看调用程序集以及调用程序集引用的任何dll。我发现它无法抛出错误信息。
您可以在上下文的LoadFromAssembly中使用MetadataWorkspace方法。
ObjectContext.MetadataWorkspace.LoadFromAssembly(组装)。
这样,EF就会知道在哪里寻找你的类型。