boy*_*yke 6 .net c# entity-framework objectcontext dbcontext
场景:尝试从一个数据库中提取和重新排列信息.DB A有一些我想要的数据.我想将它以稍微不同的结构存储在DB B上.
DB AI使用EDMX数据库生成的模型,因此它使用ObjectContext的衍生物.DB BI希望生成代码.所以我通过包管理器安装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();
}
}
Run Code Online (Sandbox Code Playgroud)
它发生在上面箭头标记的代码中的点("< - ")
FirstPVC是一个DB B属性,但在箭头点它抱怨没有属于DB B上下文的实体的概念模型.
这很奇怪,因为我尝试将DB B实体存储到DB B上下文.为什么要关心DB A的实体呢?
所有上下文都包含在同一个项目中.但是DB B的Derived DbContext只知道它自己的DbSet <>属性,突然在尝试向DbSet <>属性添加内容时,它会给我上面的粗体错误.
谁知道为什么会这样?为什么DbContext要关心另一个上下文的实体,特别是ObjectContext派生类之一.
Perhapse有用的是注意到它抱怨的实体看起来有点像这样
[EdmEntityTypeAttribute(NamespaceName="Irma2Model", Name="AccessProvider")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AccessProvider : EntityObject
{
/*****...... ******/
}
Run Code Online (Sandbox Code Playgroud)
找到答案,它不是你想听到的:
"如果您使用EDMX文件的默认代码生成,那么生成的类包含一系列属性,以帮助EF查找每个实体类型使用哪个类.EF目前有一个限制,即无法从一个POCO类加载包含具有EF属性的类的程序集.(简短的答案是否定的,您的类需要在单独的项目中).
这是一种有点人为的限制,我们意识到这种限制是痛苦的,并且将来会尝试删除."
因此,解决方法是将类拆分为两个不同的程序集.
| 归档时间: |
|
| 查看次数: |
3903 次 |
| 最近记录: |