如何永久修复升级到 EF6 后出现的 "EdmFunctionAttribute is obsolete" 警告?

How can I permanently fix the "EdmFunctionAttribute is obsolete" warning, which occurs after upgrading to EF6?

我在 upgraded a database first project from EF4 to EF 6.1.3:

之后收到警告 "EdmFunctionAttribute is obsolete"

'System.Data.Entity.Core.Objects.DataClasses.EdmFunctionAttribute' is obsolete: 'This attribute has been replaced by System.Data.Entity.DbFunctionAttribute.' C:\{myProjectPath}\DataContextEntityObjects.cs

该属性用在很多地方,例如

    [EdmFunction("DataContext", "Split")]
    public IQueryable<Split_Result> Split(global::System.String rowData, global::System.String splitOn)
    {
    // ... auto-generated code ...
    }

如果您在错误消息提到的 *.cs 文件中修复该问题,那么每次通过 从数据库更新模型 更新模型时, 错误再次出现。

如何永久解决这个问题(这样模型更新就不会再次出现)?

文件 DataContextEntityObjects.cs 是从 DataContextEntityObjects.tt 自动生成的,并在

等多个地方使用该属性
    [EdmFunction("DataContext", "Split")]
    public IQueryable<Split_Result> Split(global::System.String rowData, global::System.String splitOn)
    {
    // ... auto-generated code ...
    }

因为每次通过从数据库更新模型更新模型时,它都会自动重新生成, 解决方案是修改T4模板如下:

我已确定 T4 文件中的相关部分从这里开始(第 214-283 行):

    ////////
    ////////  Write EntityContainer and ObjectContext Function Import methods.
    ////////
    region.Begin(CodeGenerationTools.GetResourceString("Template_RegionFunctionImports"));
    foreach (EdmFunction edmFunction in container.FunctionImports)
    {

        IEnumerable<FunctionImportParameter> parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);

按照模板中的建议 How to: Customize Object Layer Code GenerationGenerating Artifacts by Using Text Templates,修改模板即可生成正确的代码。

执行以下操作:

  1. 打开 DataContextEntityObjects.tt 文件

  2. 搜索并替换以下内容:

  3. 保存文件DataContextEntityObjects.tt

从现在开始,每次更新模型时,都会生成相应的 *.cs 文件,并在其中正确创建属性,因此过时警告消失。