【问题标题】:Entity Framework: Where do I extend the CSDL/MSL?实体框架:我在哪里扩展 CSDL/MSL?
【发布时间】:2011-08-02 12:57:06
【问题描述】:

我使用的是 Entity Framework 4。我使用的是数据库优先模型,这意味着我从数据库生成了 EDM。现在我想添加一些模型定义的函数。我的问题是……在哪里?

如果我将它们放在 .edmx 文件中,下次我更新数据库并生成新的 EDM 时,我添加的所有内容不会被破坏吗?我的意思是它就在 .Designer.cs 文件的顶部说,“如果重新生成代码,对这个文件的手动更改将被覆盖。”

那么,我应该把我的补充放在什么文件里?

【问题讨论】:

    标签: entity-framework-4 edmx


    【解决方案1】:

    我会稍微深入一点,因为模型定义的函数不是很为人所知。

    模型定义的函数必须手动添加到 EDMX 文件的 CSDL 部分。您必须以 XML 格式打开文件并添加一个函数。例如这个模型定义的函数能够产生员工的全名:

    <Function Name="FullName" ReturnType="Edm.String">
      <Parameter Name="emp" Type="TestModel.Employee" />
      <DefiningExpression>
        Trim(emp.FirstName) + " " + Trim(emp.LastName)
      </DefiningExpression>
    </Function>
    

    现在您可以保存您的 EDMX 并返回给设计器。该功能仍将存在,但在模型浏览器中不可见。您可以从数据库更新模型或删除所有实体,但仍将定义该函数。 EF 不会删除 EDMX 的 CSDL 部分中的自定义修改。

    现在您需要定义 .NET 函数才能使用此模型定义的函数。你可以在任何地方做。一种方法是将部分类用于上下文,但同时您可以使用一些自定义类:

    public static class EdmFunctions
    {
        [EdmFunction("TestModel", "FullName")]
        public static string FullName(Employee e)
        {
            throw new NotSupportedException("This function is only for L2E query.");
        }
    }
    

    你就完成了。剩下的唯一任务是使用 Linq-to-Entities 查询中的函数:

    using (var context = new TestEntities())
    {
        var query = from e in context.Employees
                    select new
                        {
                            e.Id,
                            FullName = EdmFunctions.FullName(e)
                        };
        var data = query.ToList();
        ...
    }
    

    模型定义的函数只是一些可重用的实体 SQL,它被转换为 SQL,因此它们只能用于 Linq-to-Entities 查询。模型定义的函数可能要复杂得多。

    【讨论】:

    • 很好的答案 - 很高兴知道更新模型时模型定义的函数不会被破坏
    • 作为后续,还有一篇关于此的 MSDN 文章:How to: Define Custom Functions in the Conceptual Model (Entity Framework)
    • Joel Mueller 对另一个问题的回答与您提到的类似 - 它非常彻底,并且还展示了如何使 LINQ-to-Objects 也能做到这一点:[LINQ to Entities does not identify方法 'Double Parse(System.String)' 方法,并且该方法不能翻译成存储表达式][1] [1]:stackoverflow.com/a/5971677/35133
    • [EDMFunction] 现已过时,请改用 [DbFunction]
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多