带有实体框架的自定义函数

Posted

技术标签:

【中文标题】带有实体框架的自定义函数【英文标题】:Custom Functions with Entity Framework 【发布时间】:2014-08-12 10:13:59 【问题描述】:

如何在实体框架中使用自定义函数? 我正在尝试使用实体框架调用模型定义的函数。我使用.Net Framework 4.5 我正在以 XML 格式打开实体模型 (.edmx) 文件。我在 'edmx:StorageModels' 部分中添加以下代码:

  <Function Name="YearsSinceNow" ReturnType="int">
    <Parameter Name="date" Type="datetime" />
    <DefiningExpression>
      Year(CurrentDateTime()) - Year(date)
    </DefiningExpression>
  </Function>

  </Schema></edmx:StorageModels>

我收到错误“无法识别的架构元素:DefiningExpression”。 我还尝试在 edmx:ConceptualModels 部分中应用此代码。而且我有一个错误“无法识别的架构元素功能”

【问题讨论】:

你确定你试图把它放在edmx:ConceptualModels 内的Schema 元素中,因为它应该放在那里。 【参考方案1】:

尝试如下更改您的定义(在概念模型而不是存储模型中定义):

取自here

<Function Name="YearsSinceNow" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

接下来,将以下方法添加到您的应用程序中,并使用 EdmFunctionAttribute 将其映射到类似于以下内容的概念模型函数:

[EdmFunction("MyModelName", "YearsSinceNow")]
public static int YearsSinceNow(DateTime date)

    throw new NotSupportedException("Direct calls are not supported.");

向您的应用程序添加一个公共语言运行时 (CLR) 方法,该方法映射到概念模型中定义的函数。要映射该方法,您必须将 EdmFunctionAttribute 应用于该方法。注意属性的NamespaceName和FunctionName参数分别是概念模型的命名空间名称和概念模型中的函数名称。 LINQ 的函数名称解析区分大小写。

阅读How to: Define Custom Functions in the Conceptual Model (Entity Framework)

对于 Function 元素,您可以将其添加到 .edmx 文件的概念模型内容部分的 Schema 元素中以定义自定义函数。

【讨论】:

确实,但正如您所说,它应该进入概念模型。 我尝试在概念模型内部和外部模式元素中没有成功。此外 [EdmFunction("MyModelName", "YearsSinceNow")] 给出 'cannot access internal constructor 'EdmFunction' here。 从 linq 查询内部调用时出现该错误?你不能直接调用它。 我正在尝试创建课程。 public static class EdmFunctions [EdmFunction("TestModel", "FullName")] public static string FullName() throw new NotSupportedException("此函数仅用于 L2E 查询。"); 嗯....您使用的是 System.Data.Objects.DataClasses.EdmFunction 而不是 System.Data.Metadata.Edm.EdmFunction?

以上是关于带有实体框架的自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

带有 xib 文件和自定义构造函数的自定义 UITableViewCell

带有 Mono 的自定义函数 SQLite

在 keras 回调中使用带有自定义参数的自定义函数

在 dao room 数据库中创建一个带有 body 的自定义函数

带有编译时格式字符串检查的自定义 fmt 格式化函数

如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值