实体框架:我在哪里扩展CSDL/MSL?

Rap*_*Rap 18 edmx entity-framework-4

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

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

那么,我在什么文件中添加了我的内容?

Lad*_*nka 35

我会稍微深入一点,因为模型定义的函数并不是很清楚.

必须手动将模型定义的函数添加到EDMX文件的CSDL部分.您必须以XML格式打开文件并添加功能.例如,此模型定义的函数能够生成员工的全名:

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

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

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

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

你完成了.唯一剩下的任务是使用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();
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案 - 很高兴知道更新模型时不会破坏模型定义的函数 (2认同)
  • 作为后续内容,还有一篇MSDN文章:[如何:在概念模型中定义自定义函数(实体框架)](http://msdn.microsoft.com/en-us/library/dd456812的.aspx) (2认同)