【问题标题】:Using Both ObjectContext and DbContext同时使用 ObjectContext 和 DbContext
【发布时间】:2011-10-24 12:06:33
【问题描述】:

场景:尝试从一个数据库中提取信息并将其重新排列到另一个数据库。 DB A 有一些我想获取的数据。我想以稍微不同的结构将它存储在 DB B 上。

DB A 我使用 EDMX 数据库生成的模型,因此它使用 ObjectContext 的派生。 DB B 我想生成代码。所以我通过包管理器安装EntityFramework 4.1来使用代码/模型优先的方法。所以 DB B 使用了一个 DbContext 衍生物

当我尝试将信息从 DB A 存储到 DB B 时,它会说:

测试方法 RoutIT.Irma.Import.Service.Test.ImportIrma2ProductTests.ImportProducts 抛出异常:System.ArgumentException:找不到“DB A 的 EDMX 模型中的某些实体”的概念模型类型

它实际上是在将一个 DB B 实体添加到 DB B 的 Derived DbContext 的 DbSet 属性时这样做的。所以代码就像

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
            foreach (FirstPVC pvc in pvcs)
            {
                this._irmaImport.FirstPVCs.Add(pvc); <--
                this._irmaImport.SaveChanges();
            }
            scope.Complete();
        }
 }

它发生在上面箭头标记的代码点(“

FirstPVC 是 DB B 的属性,但在箭头处,它抱怨没有属于 DB B 上下文的实体的概念模型。

这很奇怪,因为我尝试将 DB B 实体存储到 DB B 上下文中。为什么要关心 DB A 的实体。

所有上下文都包含在同一个项目中。但是 DB B 的 Derived DbContext 只知道它自己的 DbSet 属性,突然在尝试向 DbSet 属性添加一些东西时,它给了我上面粗体字的错误。

有人知道为什么会这样吗?为什么 DbContext 应该关心另一个上下文的实体,特别是 ObjectContext 派生类之一。

也许注意它所抱怨的实体看起来有点像这样是有用的

[EdmEntityTypeAttribute(NamespaceName="Irma2Model", Name="AccessProvider")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AccessProvider : EntityObject
{
    /*****...... ******/
}

【问题讨论】:

  • 我想我也有同样的问题。我有两个 DB-first EDMX 映射来自同一个 DB 的不同表,现在我已将其中一个切换到较新的 EF4.1 DbContext/POCO 模型。然而,当我尝试使用后者时,我收到一个错误,提示另一个 EDMX 中的表缺少模型。也许这个答案是相关的?:stackoverflow.com/questions/3521497/…。请注意,我认为您的帖子中有错字“它抱怨没有属于 DB B 上下文的实体的概念模型”,您的意思是 DB A 对吗?
  • stackoverflow.com/questions/6899567/… 这个也是。虽然没有答案

标签: c# .net entity-framework objectcontext dbcontext


【解决方案1】:

找到了答案,但不是你想听到的:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d2a07542-cb33-48ba-86ed-4fdc70fb3f1a

"如果您使用EDMX文件的默认代码生成,那么生成的类包含一系列属性,以帮助EF找到每个实体类型使用哪个类。EF目前有一个限制,POCO类不能从包含具有 EF 属性的类的程序集中加载。(简短的回答是否定的,您的类需要位于单独的项目中)。

这是一个有点人为的限制,我们意识到这是痛苦的,并且会在未来尝试移除。”

因此解决方法是将类拆分为两个不同的程序集。

【讨论】:

  • 感谢您在这个问题上投入火中。你刚刚救了我几个小时。无论如何,我想将 edmx 类分成一个单独的程序集。您一定想知道使用 EF 在幕后创建了什么样的开销。认真考虑下一轮nhibernate!
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多