我正在尝试在插件中使用Entity Framework 6来处理我无法控制的程序。
我已经构建了一个类库来包含我的上下文/模型逻辑,我希望能够在我的addin程序集中使用它。我能够在应用程序中根据需要使用它没有问题,但是消耗应用程序需要一个包含可用连接工厂的app.config文件(在我的例子中是Sql和Sql Ce)。
必须将插件编译为类库,因此不使用该项目中的app.config文件 - 而是我怀疑它使用addin运行的程序的app.config文件。结果我得到了例外 '找不到具有不变名称'System.Data.SqlServerCe.4.0'的ADO.NET提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882
我尝试了许多奇怪而奇妙的事情但没有成功,我相信我最接近的是:
包含在插件中:
public static ProjectContext GetContext() {
SqlCeConnectionStringBuilder sqlBuilder = new SqlCeConnectionStringBuilder {
DataSource = @"C:\Test.sdf"
};
DbConnection connection = new SqlCeConnection(sqlBuilder.ToString());
return new ProjectContext(connection);
}
包含在我的API类libray中:
public ProjectContext(DbConnection connection) : base(connection, true) {
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ProjectContext, Configuration>());
Database.CreateIfNotExists();
}
当尝试从上下文(在插件中)访问数据时,此处发生异常:
var ctx = GetContext();
List<Model> list = Project.Models.Where(model => model.ParentId == 0).ToList();
当在一个单独的应用程序中作为.exe运行时,以上所有内容都是100%有效,其中包含Sql和Sql Ce的EntityFramework NuGet包以及包含以下内容的app.config文件:
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
</entityFramework>
在这种情况下,我有什么办法可以让我的程序作为插件运行吗?我希望将实际的数据库连接传递给我的ProjectContext将删除对app.config提供者列表的依赖。有没有我错过的东西可以实现这个目标?
我围绕这个主题找到的大部分内容似乎都是关于传递连接字符串所以我不知所措!
提前致谢!