相关疑难解决方法(0)

具有MySql和迁移的实体框架失败,因为"最大密钥长度为767字节"

[编辑]这个问题解决了!请参阅帖子末尾的说明.

[编辑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)

c# mysql entity-framework

33
推荐指数
3
解决办法
2万
查看次数

MySql连接器6.8.2 RC,实体框架6和代码优先

我最近升级到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版本)

  1. MySql.Data
  2. MySql.Data.Entity.EF6
  3. MySql.Web

问题是 - 代码调用我收到的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)

c# mysql entity-framework ef-code-first

8
推荐指数
2
解决办法
2万
查看次数

Code First中的Identity和Mysql-指定的密钥太长;最大密钥长度为1000个字节

我正在尝试使用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

5
推荐指数
1
解决办法
992
查看次数