entityframework使用CodeFirst创建MySql数据库出错的解决方法恢复

先告诉大家一个秘密,EF在使用 update-database 时候,使用的连接字符串来自于解决方案中的“启动项目”,而不是你在包管理器中选择的“默认项目”

0x01. 先说错误,方便大家检索到

开发环境,VS2015+MySql+EntityFramework6

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="MySql.Data" version="6.9.7" targetFramework="net45" />
  <package id="MySql.Data.Entity" version="6.9.7" targetFramework="net45" />
</packages>

执行数据库的时候报错:

PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
System.Data.SqlClient.SqlException (0x80131904): 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错) 

 这时候我的配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="conn.mysql" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=moa;user id=root;password=;" />
  </connectionStrings>
  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
</configuration>

 

0x02,一头雾水,各种怀疑

一个项目从一个解放方案,移动到另一个,就出错,BeyongCompare 比较除了应该不一样的都一样,我都怀疑EF有一个小数据库,针对每个项目记录什么配置了。

0x03,柳暗花明,发现疑点

当执行这个命令:

PM> Enable-Migrations -ConnectionStringName "conn.mysql" -Force -Verbose
Using StartUp project 'Masap.Service.Contract'. Using NuGet project 'Moa.Data'. Checking if the context targets an existing database... System.InvalidOperationException: No connection string named 'conn.mysql' could be found in the application config file.

 看到红色字了吧, 我的EF项目是Moa.Data,和Masap.Service.Contract 没有关系,在结合找不到 "conn.mysql" 连接字符串,我顿悟了。马上吧解决方案中的启动项目设置为“Moa.Data",再次运行:

PM> Enable-Migrations -ConnectionStringName "conn.mysql" -Force -Verbose
Using StartUp project 'Moa.Data'.
Using NuGet project 'Moa.Data'.
Checking if the context targets an existing database...
Code First Migrations enabled for project Moa.Data.
PM> Add-Migration Init
Scaffolding migration 'Init'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration Init' again.
PM> Update-Database
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201509301418201_Init].
Applying explicit migration: 201509301418201_Init.
Running Seed method.
PM> 

 一切正常了。

0x04,总结

EF在使用包管理器执行命令的时候,所有的配置都使用解决方案中”启动项目“的配置文件(app.config or  web.config)。而不是EF所在项目的配置文件。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.NET Framework 4.0上使用Entity Framework连接MySQL数据库需要进行以下步骤: 1. 安装MySQL Connector/Net,可以从MySQL官方网站下载。 2. 在Visual Studio中创建一个新的项目,选择“Class Library”作为项目类型。 3. 在项目中安装Entity Framework,可以通过NuGet包管理器安装。 4. 在项目中添加对MySQL Connector/Net的引用。 5. 在App.config或Web.config文件中添加如下配置(替换相应的数据库连接信息): ```xml <configuration> <connectionStrings> <add name="MySqlConnection" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;uid=username;password=password;database=mydatabase"/> </connectionStrings> <entityFramework> <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"/> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"/> </providers> </entityFramework> </configuration> ``` 6. 创建一个继承自DbContext的类,用于定义实体类和数据库表之间的映射关系。例如: ```csharp using System.Data.Entity; using MySql.Data.EntityFramework; namespace MyNamespace { [DbConfigurationType(typeof(MySqlEFConfiguration))] public class MyDbContext : DbContext { public DbSet<MyEntity> MyEntities { get; set; } public MyDbContext() : base("MySqlConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<MyEntity>() .ToTable("mytable") .HasKey(x => x.Id); } } public class MyEntity { public int Id { get; set; } public string Name { get; set; } } } ``` 7. 使用MyDbContext类进行数据库操作。例如: ```csharp using (var context = new MyDbContext()) { var entity = new MyEntity { Name = "Test" }; context.MyEntities.Add(entity); context.SaveChanges(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值