19

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

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

那么,我将添加的内容放在哪个文件中?

4

1 回答 1

36

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

模型定义的函数必须手动添加到 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 查询。模型定义的函数可能要复杂得多。

于 2011-04-10T17:56:43.313 回答