实体框架中带有包管理器控制台"Update-Database"等的编程连接字符串



我对实体框架、编程连接字符串和包控制台管理器Update-DatabaseAdd-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.

最新更新