带有实体框架的自定义函数
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