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 可以按相关实体上的属性对实体进行排序吗?