前言:
而今大家对“在ef中使用数据库上下文需要注意哪些事项”大约比较着重,同学们都想要分析一些“在ef中使用数据库上下文需要注意哪些事项”的相关文章。那么小编在网摘上汇集了一些关于“在ef中使用数据库上下文需要注意哪些事项””的相关文章,希望我们能喜欢,同学们一起来了解一下吧!前言
有些数据库的函数在.Net中有对应的函数映射,但是其中一些是没有的,这样子做是为了保持实体框架API在不同的数据库提供程序之间保持一致。
但是你可以编写代码来补充,通过注册函数,可以在EFCore中来使用数据库的函数。
内置函数
支持通过修改数据库上下文来增加对数据库内置函数的调用, 举例以使用pgsql的内置函数to_char为例,我们有一个数据库上下文OpenDbContext,修改增加如下方法
请注意,我们没有实现方法,我们只是提供了正确的签名
/// <summary>/// pg to_char内置函数
/// </summary>
/// <param name="input">要转换的值</param>
/// <param name="format">转换的格式</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
[DbFunction(Name = "to_char", IsBuiltIn = true, Isable = false)]
public static string ToChar(DateTime input, string format = "yyyy-MM-dd HH24:mi:ss")
{
throw new NotImplementedException();
}
IsBuiltIn指是否为内置函数 Isable指是否可以为
然后我一个简单的查询操作
[HttpGet("time/tochar")]public async Task<string> TimeToChar()
{
var list = await _openDbContext.Users
.Select(t => OpenDbContext.ToChar(t.CreateTime, "yyyy-MM-dd HH24:mi:ss"))
.ToListAsync();
return "success";
}
执行查询的时候,会生成以下SQL语句
SELECT to_char(u.create_time, 'yyyy-MM-dd HH24:mi:ss')自定义函数FROM sample."user" AS u
除了可以使用内置函数以外,还可以创建自己的sql函数并且以这种方式进行添加,下面使用pgsql创建一个简单的数据库函数
CREATE OR REPLACE FUNCTION sample.add_credit(source_credit double precision, addCredit int4)RETURNS double precision AS
$$
SELECT source_credit + addCredit;
$$
LANGUAGE SQL;
现在还在数据库上下文中注册
/// <summary>/// 添加学分的自定义函数
/// </summary>
/// <param name="sourceCredit">原始学分</param>
/// <param name="addCredit">要添加的学分</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
[DbFunction(Name = "add_credit", Schema = "sample", IsBuiltIn = false)]
public static double AddCredit(double sourceCredit, int addCredit)
{
throw new NotImplementedException();
}
然后我编写一个简单的查询操作
/// <summary>/// 学分相加
/// </summary>
/// <returns></returns>
[HttpGet("double/tochar")]
public async Task<string> DoubleAdd()
{
var list = await _openDbContext.Users
.Select(t => OpenDbContext.AddCredit(t.Credit, 10))
.ToListAsync();
return "success";
}
执行查询的时候,会生成以下SQL语句
SELECT sample.add_credit(u.credit, 10)总结FROM sample."user" AS u
使用 DbFunctions 是一种在EFCore查询中利用特定数据库功能的有用方法,但是需要注意。因为您正在使用数据库特定的功能,所以如果您想这样做,后期考虑移植到其他数据库就会变得更加困难。
参考文档
docs:
数据库函数:
标签: #在ef中使用数据库上下文需要注意哪些事项