首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实体框架:在哪里扩展CSDL/MSL?

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

Stack Overflow用户
提问于 2011-04-10 23:41:23
回答 1查看 10.5K关注 0票数 19

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

如果我将它们放在.edmx文件中,那么下次更新数据库并生成新的EDM时,我添加的所有内容不是都会被销毁吗?我的意思是,在.Designer.cs文件的顶部写着:“如果重新生成代码,对此文件的手动更改将被覆盖。”

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-11 01:56:43

我会稍微深入一点,因为模型定义的函数并不是很熟悉。

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

代码语言:javascript
复制
<Function Name="FullName" ReturnType="Edm.String">
  <Parameter Name="emp" Type="TestModel.Employee" />
  <DefiningExpression>
    Trim(emp.FirstName) + " " + Trim(emp.LastName)
  </DefiningExpression>
</Function>

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

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

代码语言:javascript
复制
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查询中的函数:

代码语言:javascript
复制
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查询。模型定义的函数可能要复杂得多。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5612827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档