EF - 泛型“AddOrUpdate”方法突然中断

时间:2013-01-21 17:42:05

标签: entity-framework-4 webforms asp.net-4.0

我在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值确实存在于数据库中。 .. 应该的一切都很好 - 但它一直让我失败......

这里到底发生了什么?

我确实找到了一些关于这个主题的博客和论坛帖子,但没有一个能真正启发我或帮助我解决这个问题。我一定搞砸了什么 - 不好 - 但是我真的看不到树林里的森林 - 任何提示?

1 个答案:

答案 0 :(得分:1)

一般来说,当EF无法找到具有该类型的程序集时,就会发生这种问题。看到完全异常很难弄清楚,但似乎你最近的变化以及你使用EF的方式似乎是原因。

当必须使用上下文中的ObjectSet访问它时,EF通常直接从类型本身中选择类型。在调用上下文中没有类型的其他情况下,它会查看调用程序集以及调用程序集引用的任何dll。我发现它无法抛出错误信息。

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

  

ObjectContext.MetadataWorkspace.LoadFromAssembly(组装)。

这样,EF就会知道在哪里寻找你的类型。