EF4.1 ConnectionString.ProviderName返回另一个类

时间:2011-12-02 15:53:00

标签: entity-framework-4.1 connection-string

我一直试图改进我发现的here的优秀EF实现。不幸的是,代码是为代码优先编写而编写的,我首先使用的是模型,因为我已经将数据库启动并与另一个应用程序一起运行。

在ObjectContextBuilder.cs文件中有以下方法:

public ObjectContextBuilder(string connectionStringName, string[] mappingAssemblies, bool recreateDatabaseIfExists, bool lazyLoadingEnabled)
{
    this.Conventions.Remove<IncludeMetadataConvention>();

    _cnStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
    _factory = DbProviderFactories.GetFactory(_cnStringSettings.ProviderName);
    _recreateDatabaseIfExists = recreateDatabaseIfExists;
    _lazyLoadingEnabled = lazyLoadingEnabled;

    AddConfigurations(mappingAssemblies);
}

我假设EDMX将包含前一个方法所需的映射,因此我尝试添加一个simaliar方法,该方法将接收EDMX的ObjectContext,如下所示:

 public ObjectContextBuilder(string connectionStringName, ObjectContext context, bool recreateDatabaseIfExists, bool lazyLoadingEnabled)
{
    this.Conventions.Remove<IncludeMetadataConvention>();

    _cnStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
    _factory = DbProviderFactories.GetFactory(_cnStringSettings.ProviderName);
    _recreateDatabaseIfExists = recreateDatabaseIfExists;
    _lazyLoadingEnabled = lazyLoadingEnabled;
}

这是调用方法:

    ObjectContextManager.InitStorage(new SimpleObjectContextStorage());
    var context = ((IObjectContextAdapter)new SidekickEntities());
    ObjectContextManager.Init("SidekickEntities", context.ObjectContext, true);

当执行转到_factory时,我收到一条错误,指出:

Unable to find the requested .Net Framework Data Provider.  It may not be installed.

当我查看_cnStringSettings时,Provider是System.Data.SqlClient但是在分配_factory时_cnStringSettings.ProviderName是System.Data.EntityClient。

我认为这是因为我试图使用EDMX生成的实体,并想知道是否有办法让我的新方法起作用。我对EF框架还是比较陌生的,并且仍处于陡峭的学习阶段,所以如果我完全不依赖于我正在尝试的内容,请告诉我。

这是连接字符串,因为它存储在App.Config

<add name="SidekickEntities" connectionString="metadata=res://SidekickModel/SidekickModel.csdl|res://SidekickModel/SidekickModel.ssdl|res://SidekickModel/SidekickModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=percepsrvr;Initial Catalog=Sidekick;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

2 个答案:

答案 0 :(得分:0)

拥有现有数据库并不意味着您必须先使用模型(幸运的是)。有关详细信息,请参阅Scott Gu的Using EF “Code First” with an Existing Database和TechEd 2011截屏视频Code First Development in Microsoft ADO.NET Entity Framework 4.1。为我工作很好。

我发现使用EF Model First非常痛苦,因为它不容易提供。它变得很难看,尤其是在乱用EDMX时。

答案 1 :(得分:0)

如果有任何人遇到这篇文章,我找到了问题的解决方案,即在代码中调用现有方法,如下所示:

_employeeRepository = new GenericRepository(new SidekickEntities());

GenericRepository是代码中直接接受DbContext的对象。