我对实体框架、编程连接字符串和包控制台管理器Update-Database
或Add-Migration
等问题有问题。
我正在为我的项目使用configuration.xml
文件,以便用户可以根据需要更改配置。
问题是以编程方式连接字符串...
如果我尝试使用更新数据库命令,我会得到这样的结果。
PM> Update-Database -Verbose
Using StartUp project 'acme'.
Using NuGet project 'acme'.
Target database: 'acme.Models.DbContext' (DataSource: .SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Convention).
Using Migrationens: [..., ..., ..., ..., ...].
Appending migration: ....
问题是,数据源不是.SQLEXPRESS
。例如,它My-SQLServer
。
连接字符串是。
Data Source=My-SQLServerTS;initial catalog=acme;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework
原始的工作配置条目是这样的。
<connectionStrings>
<!--<add name="DbContext" connectionString="Data Source=My-SQLServerTS;initial catalog=acme;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />-->
</connectionStrings>
DbContext 是...
using System;
using System.Data;
using System.Data.Entity.Core.Objects;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Core.EntityClient;
using System.Data.Common;
using System.Data.SqlClient;
namespace acme.Models
{
public class DbContext : DbContext, IDbContextFactory<DbContext>
{
public DbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
Database.SetInitializer<DbContext>(new MigrateDatabaseToLatestVersion<DbContext, acme.Migrations.Configuration>());
}
public DbContext()
: base()
{
Database.SetInitializer<DbContext>(new MigrateDatabaseToLatestVersion<DbContext, acme.Migrations.Configuration>());
}
public DbSet<Base> Base { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Map(m => m.MapInheritedProperties());
base.OnModelCreating(modelBuilder);
}
public DbContext Create()
{
/* First try (not working) */
EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
//ecsb.ProviderConnectionString = acme.ConfigFile.GetValue("ConnectionString");
ecsb.Provider = "System.Data.SqlClient";
ecsb.ProviderConnectionString = @"application name=";
/* Second try https://msdn.microsoft.com/en-us/library/bb738533%28v=vs.110%29.aspx (not working) */
// Initialize the connection string builder for the
// underlying provider.
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
// Set the properties for the data source.
sqlBuilder.DataSource = @"My-SQLServerTS";
sqlBuilder.InitialCatalog = "acme";
sqlBuilder.IntegratedSecurity = true;
sqlBuilder.MultipleActiveResultSets = true;
sqlBuilder.ApplicationName = "EntityFramework";
// Build the SqlConnection connection string.
string providerString = sqlBuilder.ToString();
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
//Set the provider name.
entityBuilder.Provider = "System.Data.SqlClient";
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;
return new DbContext(entityBuilder.ToString());
}
}
}
希望你能帮我:)
提前感谢!
我知道这是一个老问题。但我遇到了同样的问题。
我的代码曾经可以工作,但现在突然间它就不工作了。我确实将我的数据库移动到了新服务器,但还没有 100% 导致它的原因。无论哪种方式,我的 App.Config 和我的主网站的 Web.Config 都指向正确的连接字符串。不知道为什么它忽略它们并使用.\SQLEXPRESS...
无论如何,我确实设法通过以下方式强制它使用正确的连接字符串(临时解决方案):
Add-Migration -ConnectionString "<connection string here>"
Update-Database -ConnectionString "<connection string here>"
它会询问提供商名称,在我的情况下是System.Data.SqlClient
.