繁体   English   中英

同时使用 ObjectContext 和 DbContext

[英]Using Both ObjectContext and DbContext

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

DB AI 使用 EDMX 数据库生成 model,因此它使用 ObjectContext 的派生。 DB BI 想被代码生成。 因此,我通过 Package 管理器安装 EntityFramework 4.1 来使用代码/模型优先的方法。 所以 DB B 使用 DbContext 派生

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

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

在将 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 上下文的实体没有概念上的 model。

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

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

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

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

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

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

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

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

这是一个有点人为的限制,我们意识到这是痛苦的,将来会尝试取消。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM