C#+MySql+Code First:初始化字符串的格式不符合从索引0开始的规范
本文关键字:索引 开始 格式 First 初始化 字符串 C#+MySql+Code 不符合 | 更新日期: 2023-09-27 17:59:28
我创建了一个库项目来连接MySQL数据库。
- 包括
MySql.Data
、MySql.Data.Entity.EF6
通过Nuget=>OK - Nuget安装的
EntityFramework
=>OK - 我创建了一个
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>(); } } }
- 我编辑了
App.config
:
<connectionStrings>
<add name="myDbContext" providerName="MySql.Data.MySqlClient" connectionString="Data Source=localhost; port=3306; Initial Catalog=dbtest; uid=root; pwd=1234;" />
</connectionStrings>
- 我打开"软件包管理器控制台"并写道:
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="server=localhost;user id=YS;password=snys19931103;persistsecurityinfo=True;database=travelmobile"" 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。