我使用的是 Entity Framework 4。我使用的是数据库优先模型,这意味着我从数据库生成了 EDM。现在我想添加一些模型定义的函数。我的问题是……在哪里?
如果我将它们放在 .edmx 文件中,下次我更新数据库并生成新的 EDM 时,我的所有添加内容不会被破坏吗?我的意思是它就在 .Designer.cs 文件的顶部说,“如果重新生成代码,对这个文件的手动更改将被覆盖。”
那么,我将添加的内容放在哪个文件中?
我使用的是 Entity Framework 4。我使用的是数据库优先模型,这意味着我从数据库生成了 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 函数才能使用此模型定义的函数。你可以在任何地方做。一种方法是将部分类用于上下文,但同时您可以只使用一些自定义类:
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 查询。模型定义的函数可能要复杂得多。