如何在创建实体框架DbContext时将现有模型“附加”到现有DbConnection?

时间:2017-02-04 00:59:04

标签: .net entity-framework database-connection edmx

我有一个带有EDMX模型的装配体。我可以成功地在构造函数中创建一个DbContext指定一个连接字符串,其中包含对该程序集的引用(metadata=res://MyAssembly/MyModel.csdl|res://MyAssembly/MyModel.ssdl|res://MyAssembly/MyModel.msl ...),在这种情况下一切正常。

但是,现在我遇到的情况是,我从外部来源获得现有DbConnection,以及现有DbTransaction。我希望在DbConnection上有一个强类型的实体框架视图。因此,我使用的是另一个DbContext构造函数,而不是使用连接字符串DbContext构造函数,它使用DbConnection(然后使用context.Database.UseTransaction()来设置现有事务)

在这种情况下,只要我尝试访问其中一个表格,我就会收到错误The entity type MyType is not part of the model for the current context. - 似乎我的模型没有“附加”到现有的DbConnection

所以,我的问题是:

  • 是否有可能以某种方式将模型从包含EDMX的程序集“附加”到现有的DbConnection
  • 我注意到DbContext构造函数同时包含DbConnection DbCompiledModel 。这似乎正是我所需要的。如何从现有的包含EDMX的程序集中提取DbCompiledModel

1 个答案:

答案 0 :(得分:0)

只是我的运气,在发布赏金后立即找到答案:)几乎整个答案(减去关于交易的部分)是here - 我没想到搜索SqlConnection而不是DbConnection。

基本上,给定existingDbConnectionexistingDbTransaction

var workspace = new MetadataWorkspace(
            new string[] { "res://*/" },
            new Assembly[] { Assembly.Load("My.Assembly.Name")});
            // can use Assembly.GetExecutingAssembly() if in current assembly
var wrappedConnection = new EntityConnection(workspace, existingDbConnection, false);
var context = new DbContext(wrappedConnection, false)
context.Database.UseTransaction(existingDbTransaction);