[编辑]这个问题解决了!请参阅帖子末尾的说明.
[编辑2]好的,这个线程已经过时了,MySQL Connector的新版本已经使用MySQL EF解析器处理了这个问题.在这个帖子上寻找@KingPong的答案.不过,我还没有测试过.
我正在尝试使用MySql和EntityFramework进行迁移,但似乎有些错误.
当我进入Update-Database -Verbose包管理器控制台时,EF执行一些将"镜像"我的模型类的查询,一切都很完美,但是EF尝试执行此查询:
create table `__MigrationHistory`
(
`MigrationId` varchar(150) not null
,`ContextKey` varchar(300) not null
,`Model` longblob not null
,`ProductVersion` varchar(32) not null
,primary key ( `MigrationId`,`ContextKey`)
) engine=InnoDb auto_increment=0
Run Code Online (Sandbox Code Playgroud)
结果是: Specified key was too long; max key length is 767 bytes
我试图将我的数据库排序规则更改为utf-8,但仍然相同.也许关键长度是450个字符,做UTF-8数学(我可能错了),我认为它试图创建一个大约1800字节长度的密钥.
由于我是EF的新手,我遵循了一些教程,他们告诉我这样做:
public Configuration()
{
AutomaticMigrationsEnabled = false;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
Run Code Online (Sandbox Code Playgroud)
也许这个SQL生成器做错了,或者EF本身要求生成器生成一个高达767字节的密钥.
我该如何解决这个问题,避免这个问题并让它与MySql一起使用?
[编辑] 好的,这个问题解决了.你必须告诉EF它必须改变它生成__MigrationHistory表的方式.
我做了什么:首先,MySqlHistoryContext.cs用这个内容创建一个名为(或任何你想要的)文件:
...
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Migrations.History;
namespace [YOUR NAMESPACE].Migrations //you …Run Code Online (Sandbox Code Playgroud) 我最近升级到Entity Framework 6并安装了MySql 6.8.2 RC Connector,因为它声称现在支持EF6 Code First.
请记住,在升级之前,我的项目在连接器6.7.4和EF 5中运行良好.
我对web.config进行了以下更改
<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, Version=6.8.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
Run Code Online (Sandbox Code Playgroud)
<connectionStrings>
<add providerName="MySql.Data.MySqlClient" name="dbcontext" connectionString="Server=localhost; Database=db; Uid=un; Pwd=pw;Convert Zero Datetime=True" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
我还添加了以下引用(.net 4.5版本)
问题是 - 代码调用我收到的DBContext的那一刻:
Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)
再次 - 请记住,升级之前一切正常,所以我知道它不是代码问题,但是,我可能没有正确设置web.config?
另外 - 您可能会问,如果在升级之前它运行良好,为什么要升级?好吧,据说EF6和新的MySql连接器解决了我遇到的一些错误 - 所以我希望现在实现它,而它在开发中,当它转移到生产(几个月后)我应该能够加载6.8.x连接器的生产版本.
这是堆栈跟踪,以防它有所帮助
[NullReferenceException: Object reference not set to an instance of an object.]
MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MySQL驱动程序使用IentityCore创建CodeFirst数据库。
我的用户 DbModel就像这样-
[Table("User")]
public class User : IdentityUser<int>
{
public string Name { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和角色 DbModel之后,就像是这个-
[Table("Role")]
public class Role : IdentityRole<int>
{
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的DbContext就像这样-
public class InventoryManagementDbContext : IdentityDbContext<User, Role, int>
{
//Table List
public DbSet<Employee> Employies { get; set; }
public DbSet<ProductCategory> ProductCategorys { get; set; }
public DbSet<ProductType> ProductTypes { get; set; }
public DbSet<Product> Products { …Run Code Online (Sandbox Code Playgroud) ef-migrations asp.net-identity asp.net-core asp.net-core-2.0