gpt4 book ai didi

c# - MySQL、EF6 和 Database.CreateIfNotExists

转载 作者:行者123 更新时间:2023-11-29 16:14:19 26 4
gpt4 key购买 nike

我遇到 MySQL 无法使用 EF6 创建数据库的问题。此代码在 MSSQL Server 中运行良好(只需将提供程序更改为“System.Data.SqlClient”):

public class MyDbContext : DbContext
{
public MyDbContext(string connectionString)
: base(GetConnection(connectionString),true)
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());

//Database.Initialize(true);
Database.CreateIfNotExists();
}

public DbSet<MyData> MyData { get; set; }

public static DbConnection GetConnection(string connectionString)
{
var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");

var connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
return connection;
}

}

问题出在“Database.CreateIfNotExists();”行。它抛出一个 NullReferenceException... 两个“Database.Initialize(true);”和“Database.CreateIfNotExists()”抛出相同的错误。

我的连接字符串是:

Server=localhost;Database=MyDatabase;Uid=myUser;Pwd=myPassword;

完全相同的代码在 SQL Server 上运行良好。我什至删除了数据库,SQL Server 重新创建了它。

做了一些测试,使用MySQL Shell,我手动创建了“MyDatabase”,错误没有发生,但表没有创建。

我需要一些额外的代码才能 MySQL 自动创建数据库和表吗?

其他测试:我添加了以下代码:

if (!Database.Exists())
{
Database.Create();
}

“Database.Exists()”工作正常,问题出在“.Database.Create()”。真的,我想我在这里遗漏了一些东西。

* 编辑*我的应用程序配置。 (我没有使用 app.config 中的连接字符串)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.10.8.0" newVersion="6.10.8.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

最佳答案

找到了!阅读 MySql 文档 here ,我做了 2 处更改:

(1) 将第二个构造函数添加到我的 DbContext:

// Constructor to use on a DbConnection that is already opened
public MyDbContext(DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}

(2) 使用这个新的构造函数,生成数据库的代码是:

using (MySqlConnection connection = new MySqlConnection(myConnectionString))
{
using (MyDbContext contextDB = new MyDbContext(connection, false))
{
contextDB.Database.CreateIfNotExists();
}
}

希望对大家有帮助!

关于c# - MySQL、EF6 和 Database.CreateIfNotExists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54966195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com