原文地址;Support for New Data Types and Other Improvements in dotConnect for MySQL 8.21
原文作者:DotConnect Team
新版本的 Devart dotConnect for MySQL 包含对 Entity Framework Core 支持的重大改进。我们支持新的数据类型 Uri、IPAddress、PhysicalAddress 并扩展了将 LINQ 查询转换为 SQL 的功能。此外,我们改进了对在 EF6 的 LINQ 查询中使用 JSON 的支持。
Uri 数据类型映射
对于 Entity Framework Core 3、5 和 6,dotConnect for MySQL 现在支持将 Internet/Intranet System.Uri 类型映射到 Oracle 字符串数据类型。
public class Blog { public int Id { get; set; } public Uri Url { get; set; } }
复制
CREATE TABLE Blog ( Id int AUTO_INCREMENT UNIQUE NOT NULL, Url longtext NOT NULL, PRIMARY KEY (Id) )
复制
IPAddress 和 PhysicalAddress 数据类型映射
对于 Entity Framework Core 5 和 6,dotConnect for MySQL 现在支持将网络类型 System.Net.IPAddress 和 System.Net.NetworkInformation.PhysicalAddress映射 到 MySQL 字符串数据类型。
public class AccessLog { public int Id { get; set; } public Uri Url { get; set; } public IPAddress IP { get; set; } public DateTime Timestamp { get; set; } }
复制
CREATE TABLE AccessLog ( Id int AUTO_INCREMENT UNIQUE NOT NULL, Url longtext NOT NULL, IP varchar(45) NOT NULL, `Timestamp` datetime NOT NULL, PRIMARY KEY (Id) )
复制
EF Core LINQ to Entities 改进
EF Core 3、EF Core 5、EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译:
- String类的静态方法 IsNullOrWhiteSpace()
- DateTime 类的静态属性 Today 和实例属性 DayOfWeek
- 静态方法 Sqrt()、Max()、Min()、Log()、Log10()、Sin()、Cos()、Tan()、
Asin()、Acos()、Atan()、Atan2()数学课_
EF Core 5 和 EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译:
-
静态方法 Abs()、Round()、Truncate()、Floor()、Ceiling()、Pow()、Sqrt()、Max()、Min()、Log()、Log10()、Sin()、 MathF类的 Cos()、Tan()、Asin()、Acos()、Atan()、Atan2 ()
EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译: -
Math和MathF类的静态方法 Log2()
JSON 的 EF6 LINQ to Entity 改进
尽管 EF Core 进行了开发,但 EF6 仍然是 ORM 的当前版本,由于 EF6 和 EF Core 之间存在的功能差距以及行为差异,对于某些项目来说,从该版本迁移到 EF Core 很困难。因此,我们主要根据用户请求继续完善 EF6 功能。
在这个版本中,我们改进了对存储在 MySQL JSON 数据类型中的数据的支持。
public class JsonTable { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Column(TypeName = "json")] public string JObject { get; set; } }
复制
MySqlJsonFunctions 类包含一个 Extract() 方法,用于从 JSON 值中获取字段的文本值:
var query = context.JsonTable.Where(t => MySqlJsonFunctions.Extract(t.JObject, "$.name") == "Apple").ToList(); SELECT Extent1.Id, Extent1.JObject FROM JsonTable AS Extent1 WHERE JSON_EXTRACT(Extent1.JObject, '$.name') = 'Apple'
复制
可能还需要处理类型化的非字符串值,因此已将方法添加到 MySqlJsonFunctions 类以获取其他 .NET 类型的值:ExtractAsByte()、ExtractAsSByte()、ExtractAsInt16()、ExtractAsInt32()、ExtractAsInt64 ()、ExtractAsSingle()、ExtractAsDouble()、ExtractAsDecimal()、ExtractAsDateTime()。
现在,可以编写这样的 LINQ 查询:
var query = context.JsonTable .Where(t => MySqlJsonFunctions.ExtractAsInt32(t.JObject, "$.weight") > 10) .Select(t => new { Name = MySqlJsonFunctions.Extract(t.JObject, "$.name"), Weight = MySqlJsonFunctions.ExtractAsDecimal(t.JObject, "$.weight"), Date = MySqlJsonFunctions.ExtractAsDateTime(t.JObject, "$.date") }).ToList(); SELECT JSON_EXTRACT(Extent1.JObject, '$.name') AS C1, JSON_EXTRACT(Extent1.JObject, '$.weight') AS C2, CAST(JSON_UNQUOTE(JSON_EXTRACT(Extent1.JObject, '$.date')) AS DATETIME) AS C3 FROM JsonTable AS Extent1 WHERE JSON_EXTRACT(Extent1.JObject, '$.weight') > 10
复制
结论
我们很高兴为 MySQL 提供更新的 Devart dotConnect,它具有新的实体框架功能。此外,计划继续开发 EF 和 EF Core,扩展对 LINQ 查询的支持,并添加对映射新数据类型的支持。