c# - 在实体框架中映射自定义数据库值函数
问题描述
我有一个简单的数据库函数,它需要两个字符串作为参数并返回一个字符串。我想将此与实体框架进行映射。与这个问题类似,我创建了一个简单的函数头:
[DbFunction("dbo", "StripCharacters")]
public static string StripCharacters(string input, string pattern = "^A-Z0-9") => throw new NotSupportedException();
就像在链接的帖子中一样,一旦我尝试在我的一个查询中使用此方法,我就会收到相同的错误消息。异常消息是:
System.String StripCharacters(System.String, System.String)
类型中的方法DE.ZA.TrailerLoadingAssistant.Web.Models.DatabaseEntities
无法转换为 LINQ to Entities 存储表达式
await mapi.db.TrailerAutocompleteHelpers
.Where(t => t.SearchString.Contains(DatabaseEntities.StripCharacters(userInput, "^A-Z0-9")))
.ToListAsync();
这是数据库功能:
CREATE FUNCTION [dbo].[StripCharacters]
(
@String NVARCHAR(MAX),
@MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX) WITH SCHEMABINDING
AS
BEGIN
SET @MatchExpression = '%['+@MatchExpression+']%'
WHILE PatIndex(@MatchExpression, @String) > 0
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
RETURN @String
END
我怎么解决这个问题?
解决方案
我实际上犯了两个错误。首先,您必须手动将函数声明添加到您的 EDMX 文件中:
<Function Name="StripCharacters" ReturnType="nvarchar" Schema="dbo" >
<Parameter Name="String" Mode="In" Type="nvarchar" />
<Parameter Name="MatchExpression" Mode="In" Type="varchar" />
</Function>
其次,DbFunction
属性的第一个参数不能是你的数据库的模式名称,而是实体框架模型命名空间。这可以再次在 EDMX 文件中找到:
<Schema Namespace="MyApplicationModel.Store" ...>
正确的属性是:
[DbFunction("MyApplicationModel.Store", "StripCharacters")]
推荐阅读
- python-3.x - 在 Pycharm 中隐藏用户输入
- sql - 我需要知道两个日期范围与 SQL Server 共有的天数
- node.js - WOPI nodejs, express, react集成
- jquery - 动画 Jquery 分离/附加到
- r - rtools 35 是否需要 cygwin
- apache-kafka - Kafka Connect HDFS 配置设置?
- for-loop - 包含另一个函数的函数的时间复杂度
- vue.js - 运行 webpack 时出现 IE11 错误
- vba - 将来自不同工作簿(在 1 个文件中)的多个工作表合并到包含 1 个工作表“sheets1”的工作簿
- javascript - msSaveBlob 在 IE 中不起作用