更新:问题已解决,请查看本问题的结尾。
问题:
我们正在尝试在同一个AppDomain
中同时使用SQL Server和SQL Server CE,并使用Entity Framework 6和代码配置。然而这个简单的场景似乎不被“设计支持”。EF团队表示:
注意:我们不支持在同一个AppDomain中使用多个配置类。如果您使用此属性设置两个上下文的不同配置类,将引发异常。
更多信息请参见:Code-based Configuration (Codeplex)
问题:
我们如何从这里继续前进?任何帮助都将非常感激!除了AppDomain
之外,是否有一种更灵活的方式将配置连接到上下文?(我们的上下文类位于不同的程序集中。我们已经尝试过DbConfigurationType
属性,但问题仍出在EF本身)
配置文件:
正常SQL服务器的配置
public class EfConfiguration : DbConfiguration
{
public EfConfiguration()
{
SetProviderServices(
SqlProviderServices.ProviderInvariantName,
SqlProviderServices.Instance);
SetDefaultConnectionFactory(new SqlConnectionFactory());
}
}
SQL Server Compact Edition 的配置
public class EfCeConfiguration : DbConfiguration
{
public EfCeConfiguration()
{
SetProviderServices(
SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
SetDefaultConnectionFactory(
new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
}
}
更新:
我们遇到的错误是:
System.TypeInitializationException:'MyProject.Repositories.Base.DataContext' 的类型初始化程序引发了异常。----> System.InvalidOperationException:设置了 'EfCeConfiguration' 的实例,但此类型没有在与 'DataContext' 上下文相同的程序集中发现。将 DbConfiguration 类型放置在与 DbContext 类型相同的程序集中,或者在 DbContext 类型上使用 DbConfigurationTypeAttribute 指定 DbConfiguration 类型,或在配置文件中设置 DbConfiguration 类型。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260883。
更新2,解决方法: 如上所述,我们只能拥有一个配置。这是一个问题,因为Sql和SqlCe使用不同的提供程序。如果我们使用“SetDefaultConnectionFactory”来适配一种类型的数据库,则另一个将失败。
相反,像下面标记为答案的帖子所述,将连接提供给上下文。一旦您始终使用连接而不是连接字符串初始化上下文,就可以开始工作了。您可以从配置中删除 SetDefaultConnectionFactory 调用。我们只使用以下代码配置 SqlCe 上下文,并且没有为 Sql 上下文进行任何配置。
public class CommonEfConfiguration : DbConfiguration
{
public CommonEfConfiguration()
{
// EF does not know if the ce provider by default,
// therefore it is required to be informed about it.
// The connection factories are not necessary since the connection
// is always created in the UnitOfWork classes
SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
}
}