C#+MySql+Code First:初始化字符串的格式不符合从索引0开始的规范



我创建了一个库项目来连接MySQL数据库。

  1. 包括MySql.DataMySql.Data.Entity.EF6通过Nuget=>OK
  2. Nuget安装的EntityFramework=>OK
  3. 我创建了一个MyContext.cs:
namespace Project_Core.DAL.Context
{
    [DbConfigurationType(typeof(MySqlEFConfiguration))]
    public class MyContext: DbContext
    {
        public MyContext()
            : base("myDbContext")
        {
        }
        public DbSet<Staff> Staffs { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}
  1. 我编辑了App.config:

<connectionStrings> <add name="myDbContext" providerName="MySql.Data.MySqlClient" connectionString="Data Source=localhost; port=3306; Initial Catalog=dbtest; uid=root; pwd=1234;" /> </connectionStrings>

  1. 我打开"软件包管理器控制台"并写道:

Enable-Migrations -Force

但是我得到了这些错误:

Checking if the context targets an existing database...
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0.
   at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)
   at System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey)
   at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules)
   at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
   at MySql.Data.MySqlClient.MySqlConnectionStringBuilder..ctor(String connStr)
   at MySql.Data.MySqlClient.MySqlConnection.set_ConnectionString(String value)
   at MySql.Data.MySqlClient.MySqlConnection..ctor(String connectionString)
   at MySql.Data.Entity.MySqlConnectionFactory.CreateConnection(String connectionString)
   at System.Data.Entity.Internal.LazyInternalConnection.Initialize()
   at System.Data.Entity.Internal.LazyInternalConnection.get_Connection()
   at System.Data.Entity.Internal.LazyInternalContext.get_Connection()
   at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbProviderInfo modelProviderInfo, AppConfig config, DbConnectionInfo connectionInfo)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext)
   at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
   at System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(DbMigrationsConfiguration migrationsConfiguration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldInitialCreate(String language, String rootNamespace)
   at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Format of the initialization string does not conform to specification starting at index 0.

帮我解决,谢谢!

已解决

  • 我试图将base("myDbContext")更改为base("name=myDbContext"),但它抛出错误:"在应用程序配置文件中找不到名为‘myDbContext’的连接字符串。"

  • 我一直在搜索并决定将connectionString复制到base:CCD_ 10及其作用。

嘿,所以真正的修复(而不是你在这里所做的破解)。。。

它不会告诉你这一点,但标准库("{DBConnectionName}")失败的真正原因是因为文件夹访问web.config的权限问题,因为迁移实际上是在不同的用户下运行的。

我遇到了这个问题,所以我所做的就是转到web.config所在的文件夹,1) 右键单击并转到属性2) 转到安全3) 添加用户,每个人4) 刻度完全控制5) 转到高级6) 勾选"用以下内容替换子对象权限"框7) 命中应用程序8) 重新运行"添加迁移"或"启用迁移",它将正常工作。

希望这能帮助到别人!

在我们的特殊情况下,我们在一个单独的项目中有DbContext。

尽管使用在"添加迁移"命令中明确设置了项目

Add-Migration -Name Migration1 -Project SeparateDbContextProject 

仍然失败

初始化字符串的格式不符合从索引0开始的规范。

只有当SeparateDbContextProject被设置为启动项目时,迁移才成功。

数据源=localhost;端口=3306;初始目录=dbtest;uid=根;pwd=1234;

这似乎是MS-SQL语法。我不知道MySql是否支持它。试试:

服务器=localhost;端口=3306;数据库=数据库测试;uid=根;pwd=1234;

<connectionStrings>
    <add name="TravelMobileEntities" connectionString="metadata=res://*/ServerDatabaseModel.csdl|res://*/ServerDatabaseModel.ssdl|res://*/ServerDatabaseModel.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;user id=YS;password=snys19931103;persistsecurityinfo=True;database=travelmobile&quot;" providerName="System.Data.EntityClient"/></connectionStrings>

哼。。。我不知道实际的问题在哪里。在我的情况下,我没有使用"代码优先"模式。但是"EF with MySQL"。上面是我的连接字符串,效果非常好,希望这能对你有所帮助。如果你已经解决了你的问题,请告诉我它在哪里。

这也解决了我使用Code First和MSSQL的问题。在开发人员IIS中,连接在没有将其传递给base(string nameOrConnectionString)参数的情况下工作,但一旦我发布到IIS,代码就会出现以下错误。"初始化字符串的格式不符合从索引0开始的规范"。我花了很多时间寻找,大多数其他论坛都指出连接字符串导致了这个错误,这是真的,但在我的情况下,这不是连接字符串语法的错误。

public class EntityContext : DbContext
{
    public static EntityContext EntityStatic()
    {
    var entityCnxStringBuilder = new EntityConnectionStringBuilder("");
    var sqlCnxStringBuilder = new SqlConnectionStringBuilder(entityCnxStringBuilder.ProviderConnectionString);
        sqlCnxStringBuilder.DataSource = "DataSource";
        sqlCnxStringBuilder.UserID = "User";
        sqlCnxStringBuilder.Password = "Password";
        sqlCnxStringBuilder.InitialCatalog = "DatabaseName";
        sqlCnxStringBuilder.ConnectTimeout = 10;
        sqlCnxStringBuilder.Enlist = false;
        sqlCnxStringBuilder.Pooling = false;
        sqlCnxStringBuilder.AsynchronousProcessing = true;
        sqlCnxStringBuilder.TrustServerCertificate = true;
        sqlCnxStringBuilder.Encrypt = true;
        conn = sqlCnxStringBuilder.ConnectionString;
        //For reference
        //string conn = "Data Source=localhost;Initial Catalog=;User ID=root;Password=1234;";
        return new EntityContext(conn);
    }
    public EntityContext(string conn) : base(conn)
    {    
    }
}

要从您的控制器使用此代码

var myEntity = EntityContext.EntityStatic();

将DAL(DataAccessLayer)连接字符串(从配置文件)复制到UI层的配置文件。并在配置文件中注释DAL的connectionsstring。

最新更新