Mysql Entity Framework 上的 Guid 属性

Posted

技术标签:

【中文标题】Mysql Entity Framework 上的 Guid 属性【英文标题】:Guid property on Mysql Entity Framework 【发布时间】:2017-12-20 13:39:43 【问题描述】:

我在 ASP.NET Core 应用程序上使用带有 mysql 扩展的实体框架。我的一个域模型Message 具有 Guid 属性,当我想对我的 DbContext 执行任何操作时,我收到一个错误:The property 'Message.ID' is of type 'Guid' which is not supported by current database provider. Either change the property CLR type or manually configure the database type for it.

如何“手动配置数据库类型”?我读过它应该映射为 CHAR(36),但我在应用程序端找不到如何做到这一点。

@更新

当我将属性[Column(TypeName = "char(32)")] 设置为Guid 属性时,错误仍然存​​在。

这个方法也不行

protected override void OnModelCreating(ModelBuilder modelBuilder)

  var messageEntity = modelBuilder.Entity< Message>();
  messageEntity.Property(x => x.ID).
   HasAnnotation("Column", new  TypeName = "char(32)" );

【问题讨论】:

您应该在 DB 和 EF 中使用 char(32) 或更宽的字段 string 来存储 GUID。您可以使用 EF 更新数据库向导更新表,也可以手动更改 EF db XML 文件。将 guid 更改为字符串,将表结构更改为 char(36)。 MySql 有没有办法将 Guid 定义为char(32)binary(16)?所以我可以在我的应用程序中使用 Guid 而无需任何包装器。 【参考方案1】:

我遇到了这个问题,我通过这种方式解决了:

    我从我的项目中删除了 MySql.Data.EntityFrameworkCore

    我通过Nuget 安装了Pomelo.EntityFrameworkCore.MySql 和这个 数据提供者正确映射了Guid

    我将方法名称UseMySQL 更改为UseMySql 并在Startup.cs 处添加using Microsoft.EntityFrameworkCore;


services.AddDbContext<MyDbContext>(options =>               
options.UseMySql(Configuration.GetConnectionString("MyContext")));

记得确保Guid 是数据库中的数据类型char(36)

【讨论】:

混合了来自不同来源的信息并有一点耐心尝试;) CHAR(36) 映射到 POCO 类属性中的哪种数据类型?是Guid 还是String 你可以使用Guid char(36) for Guid 使用 BINARY(16) 效率低【参考方案2】:

我已经成功地将Guid 类型与 MySql EF 在常规 ASP.NET(非核心)中使用数据库优先方法。

为此,我在 MySql 中将列类型定义为BINARY(16)。 自从我开发该模型以来已经有一段时间了,但我想我记得 MySql EF 提供程序会自动将 EF 模型中的 BINARY(16) 映射到 System.Guid

您必须使用oldguids=true 连接字符串属性,以便MySql 使用BINARY(16) 类型的guid 而不是默认的CHAR(36)

我还认为在连接字符串中创建CHAR(36) 列并跳过oldguids=true 部分也会导致相同的结果。

【讨论】:

我已将oldguids=true 添加到连接字符串中,但没有任何改变。我想解决这个问题,但首先使用代码。感谢您的回复

以上是关于Mysql Entity Framework 上的 Guid 属性的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 MySQL - 与 MySQL 引擎的性能差异

Linux 上的 C# DotNet Entity Framework Core Migrations 错误

Entity Framework 6 的动态 MySQL 数据库连接

Entity Framework 可以按相关实体上的属性对实体进行排序吗?

Entity Framework 6 和 mysql TableDetails 强类型异常

来自 MYSQL 中某个范围的 Entity Framework Core 随机记录