簡體   English   中英

HasDbFunction 未將 CLR function 映射到 SQL 服務器 function

[英]HasDbFunction not mapping the CLR function to the SQL Server function

我想在 SQL 服務器中創建 MyDbFunction 標量 function 並使用 HasDbFunction 映射從 .NET 5 應用程序調用它由於某種原因,映射總是被忽略。 我已經簡化了我的示例,以確保它不是簽名/參數問題,但這並沒有幫助。 我按照官方文檔構建它: https://docs.microsoft.com/en-us/ef/core/querying/user-defined-function-mapping

第 1 步。我創建了這個 CLR function:

public int MyCLRFunction (int @Code)
  => throw new NotSupportedException("Mapping issue for MyDbFunction");

第2步。 我將映射添加到我的數據上下文 SPContext 中,如下所示:

static void OnModelCreating(ModelBuilder modelBuilder)  
{                 
  modelBuilder.HasDbFunction(typeof(SPContext).GetMethod(nameof(SPContext.MyCLRFunction), new[] 
  { typeof(int) })).HasName("MyDbFunction");
}

當我在調試模式下運行它時,我可以看到調試器在運行 OnModelCreating 時調用了映射。 我希望在調用 MyCLRFunction(2) 時,它會在調用數據庫上的 MyDbFunction 后返回 42。 它不應該觸發 CLRFunction 主體中的異常,但始終會觸發異常。 什么可能導致映射被忽略?

默認模式上 SQL Function 的代碼

Create FUNCTION [dbo].[MyDbFunction]
(
    @Code int
    
)
RETURNS int
AS
BEGIN

return 42

END

我嘗試添加此標簽,但也無濟於事

[DbFunction("MyDbFunction", "dbo")]
public int MyCLRFunction (int @Code)
  => throw new NotSupportedException("Mapping issue for MyDbFunction");

我嘗試按照官方文檔中的建議在另一個 class 中將 MyCLRFunction 定義為 static 方法:

In the example, the method is defined on DbContext, but it can also be defined as a static method inside other classes.

我不確定這應該如何工作,因為如果它在另一個 class 中定義為 static 方法並在不首先調用 datacontext 的情況下運行它,則永遠不會調用帶有 HasDbFunction 的映射。

到目前為止,我看到的最有效的是:

    public static decimal? MyFunction(int code)
    {
        using (var db = new MyContext())
        {
            try
            {
                return db.AnyEntityWithValues.Take(1).Select(t => db.MyCLRFunction(code).Single();
            }
            catch (Exception e)
            {
                return null;
            }
        }
    }

我希望我可以不使用 DataContext 的擴展方法

  var myVal = db.MyCLRFunction(code);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM