在实体框架中映射自定义数据库值函数

2024-05-04

我有一个简单的数据库函数,它需要两个字符串作为参数并返回一个字符串。我想用实体框架来映射它。如同这个问题 https://stackoverflow.com/questions/45451383/dbfunction-cannot-be-translated-into-a-linq-to-entities-store-expression,我创建了一个简单的函数头:

[DbFunction("dbo", "StripCharacters")]
public static string StripCharacters(string input, string pattern = "^A-Z0-9") => throw new NotSupportedException();

就像链接的帖子中一样,当我尝试在其中一个查询中使用此方法时,我会收到相同的错误消息。异常消息是:

Method 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")]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实体框架中映射自定义数据库值函数 的相关文章

随机推荐