3

我在我的 ASP.NET 4.0 Webforms 应用程序中使用实体框架 4(数据库优先方法)。

我基本上在做的是从 my 中获取要编辑的实体ObjectContext,并在 Web 表单上显示用户应该输入数据(或修改现有数据)的字段。

当需要将数据存储回来时,我正在从 Web 表单中读取值,构建一个新Entity实例,然后我有一个名为的通用方法AddOrUpdate来检测这是否是一个新实体(因此它需要插入它),或者如果它是现有的(因此它需要更新现有数据)。

我的方法使用EntityKeyand 检查对象上下文是否已经知道这个对象 - 非常类似于微软的 Cesar de la Torre在他的博客文章中展示的内容:

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确实存在于数据库中......一切都应该没问题 - 但它一直在我身上失败......

这里到底发生了什么??

我确实找到了一些关于该主题的博客和论坛帖子,但没有一个可以真正启发我或帮助我解决问题。我一定是搞砸了——糟糕——但我真的只见树木不见森林——有什么提示吗?

4

1 回答 1

1

通常,当 EF 找不到具有该类型的程序集时,就会发生此类问题。如果没有看到完整的异常,很难准确地弄清楚,但似乎您最近的更改以及您使用 EF 的方式似乎是原因。

EF 通常在必须使用上下文中的 ObjectSet 访问类型时直接从类型本身中选择类型。在其他情况下,类型在调用的上下文中不可用,它会查看调用程序集和调用程序集引用的任何 dll。如果找不到它,它会抛出错误消息。

您可以在上下文的MetadataWorkspace中使用LoadFromAssembly方法。

ObjectContext.MetadataWorkspace.LoadFromAssembly(程序集)。

这样 EF 将知道在哪里查找您的类型。

于 2014-07-19T17:17:35.777 回答