entity-framework-4 - Entity Framework :在哪里扩展CSDL/MSL?

标签 entity-framework-4 edmx

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

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

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

最佳答案

由于模型定义的函数不是很为人所知,因此我将对此进行深入介绍。

必须将模型定义的功能手动添加到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函数才能使用此模型定义的函数。您可以在任何地方进行。一种方法是使用局部类来关联上下文,但同时您可以只使用一些cutom类:

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();
    ...
}


模型定义的函数只是一些可重用的Entity SQL,它已转换为SQL,因此只能在Linq-to-entities查询中使用。模型定义的函数可能要复杂得多。

关于entity-framework-4 - Entity Framework :在哪里扩展CSDL/MSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5612827/

相关文章:

Oracle 开发人员工具 (ODT) 和 Visual Studio 2017 集成

c# - 在edmx文件中手动添加存储过程

c# - 是否可以在 Lambda 表达式中包含 SqlFunctions.StringConvert?

oracle - Entity Framework 创建疯狂的 bin 表?为什么?

asp.net-mvc - 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用

asp.net-mvc - 概念类型中的成员数量不匹配 - 但确实匹配

asp.net-mvc - Entity Framework : LINQ Include() does not work after DB update, 为什么?

c# - EF6 和 EF4.1 在文件层次结构中的区别

c# - linq 加入 guid 和字符串列

asp.net-mvc-3 - Entity Framework 检测到有冲突的更改。尝试插入多个具有相同键的实体时可能会发生这种情况