使用ObjectContext和DbContext

时间:2011-08-10 21:55:38

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

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

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

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

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

在将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();
        }
 }

它发生在上面箭头标记的代码中的点(“&lt; - ”)

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

“如果您使用EDMX文件的默认代码生成,则生成的类包含一系列属性,以帮助EF查找每个实体类型使用哪个类.EF目前有一个POCO类不能的限制从包含具有EF属性的类的程序集加载。(简答之,不需要,您的类需要在不同的项目中)。

这是一种有点人为的限制,我们意识到这是一种痛苦,将来会尝试删除。“

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