我一直试图改进我发现的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="Data Source=percepsrvr;Initial Catalog=Sidekick;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
答案 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的对象。