原文地址;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 查询的支持,并添加对映射新数据类型的支持。




