• EntityFramework4的POCO模板生成FunctionImport返回空的服务端调用代码


             我们知道Entity Framework 4 默认根据MODEL生成ServerCode, 现在我们使用POCO T4模板。有个小问题,对于那些Function Import的存储过程没有返回值,却没有生成相应的CODE。主要生成于一个DataContext下,通常是XXXXX.Context.tt的模板。打开模板,你可以找到这么一行代码:

    if (edmFunction.ReturnParameter == null)

            就是这里了,接下我们自己来修改一下。最后修改完后,如下:

    <#
    //*********************************************************
    //
    //    Copyright (c) Microsoft. All rights reserved.
    //    This code is licensed under the Microsoft Public License.
    //    THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
    //    ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
    //    IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
    //    PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
    //
    //*********************************************************
    #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ include file="EF.Utility.CS.ttinclude"#><#@
     output extension=".cs"#><#
     
    CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataTools ef = new MetadataTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this);
     
    string inputFile = @"model.edmx";
    EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
    string namespaceName = code.VsNamespaceSuggestion();
     
    EntityContainer container = ItemCollection.GetItems<EntityContainer>().FirstOrDefault();
    if (container == null)
    {
        return "// No EntityContainer exists in the model, so no code was generated";
    }
    #>
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated from a template.
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------
     
    using System;
    using System.Data.Objects;
    using System.Data.EntityClient;
     
    <#
    if (!String.IsNullOrEmpty(namespaceName))
    {
    #>
    namespace <#=code.EscapeNamespace(namespaceName)#>
    {
    <#
        PushIndent(CodeRegion.GetIndent(1));
    }
    #>
    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
    {
        public const string ConnectionString = "name=<#=container.Name#>";
        public const string ContainerName = "<#=container.Name#>";
     
        #region Constructors
     
        public <#=code.Escape(container)#>()
            : base(ConnectionString, ContainerName)
        {
    <#
            WriteLazyLoadingEnabled(container);
    #>
        }
     
        public <#=code.Escape(container)#>(string connectionString)
            : base(connectionString, ContainerName)
        {
    <#
            WriteLazyLoadingEnabled(container);
    #>
        }
     
        public <#=code.Escape(container)#>(EntityConnection connection)
            : base(connection, ContainerName)
        {
    <#
            WriteLazyLoadingEnabled(container);
    #>
        }
     
        #endregion
     
    <#
            region.Begin("ObjectSet Properties", 2);
     
            foreach (EntitySet entitySet in container.BaseEntitySets.OfType<EntitySet>())
            {
    #>
     
        <#=Accessibility.ForReadOnlyProperty(entitySet)#> ObjectSet<<#=code.Escape(entitySet.ElementType)#>> <#=code.Escape(entitySet)#>
        {
            get { return <#=code.FieldName(entitySet) #>  ?? (<#=code.FieldName(entitySet)#> = CreateObjectSet<<#=code.Escape(entitySet.ElementType)#>>("<#=entitySet.Name#>")); }
        }
        private ObjectSet<<#=code.Escape(entitySet.ElementType)#>> <#=code.FieldName(entitySet)#>;
    <#
            }
     
            region.End();
     
            region.Begin("Function Imports");
     
            foreach (EdmFunction edmFunction in container.FunctionImports)
            {
                var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
                string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
                string returnTypeElement = "int";
                if (edmFunction.ReturnParameter == null)
                {
    #>
     
        <#=Accessibility.ForMethod(edmFunction)#> void <#=code.Escape(edmFunction)#>(<#=paramList#>)
        {
    <#
                }
                else
                {
                    returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
    #>
     
        <#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>)
        {
    <#
                }
     
                foreach (var parameter in parameters)
                {
                    if (!parameter.NeedsLocalVariable)
                    {
                        continue;
                    }
    #>
            ObjectParameter <#=parameter.LocalVariableName#>;
            if (<#=parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"#>)
            {
                <#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", <#=parameter.FunctionParameterName#>);
            }
            else
            {
                <#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", typeof(<#=parameter.RawClrTypeName#>));
            }
            
    <#
                }
                if (edmFunction.ReturnParameter == null)
                {
    #>
            base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>);
        }
    <#
                }
                else
                {
    #>
            return base.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>);
        }
    <#
                }
            }
            region.End();
     
    #>
    }
    <#
    if (!String.IsNullOrEmpty(namespaceName))
    {
        PopIndent();
    #>
    }
    <#
    }
    #>
    <#+
     
    private void WriteLazyLoadingEnabled(EntityContainer container)
    {
       string lazyLoadingAttributeValue = null;
       string lazyLoadingAttributeName = MetadataConstants.EDM_ANNOTATION_09_02 + ":LazyLoadingEnabled";
       if(MetadataTools.TryGetStringMetadataPropertySetting(container, lazyLoadingAttributeName, out lazyLoadingAttributeValue))
       {
           bool isLazyLoading = false;
           if(bool.TryParse(lazyLoadingAttributeValue, out isLazyLoading))
           {
    #>
            this.ContextOptions.LazyLoadingEnabled = <#=isLazyLoading.ToString().ToLowerInvariant()#>;
    <#+
           }
       }
    }
    #>

         把那个inputfile变量的值替换成你的edmx,就可以使用了。将生成这样的代码,注意这个方法返回是void:

       1:      public partial class Entities : ObjectContext
       2:      {
       3:        
       4:          public void ChangeForumID(string thread, Nullable<int> forum)
       5:          {
       6:              ObjectParameter threadParameter;
       7:              if (thread != null)
       8:              {
       9:                  threadParameter = new ObjectParameter("Thread", thread);
      10:              }
      11:              else
      12:              {
      13:                  threadParameter = new ObjectParameter("Thread", typeof(string));
      14:              }
      15:   
      16:              ObjectParameter forumParameter;
      17:              if (forum.HasValue)
      18:              {
      19:                  forumParameter = new ObjectParameter("Forum", forum);
      20:              }
      21:              else
      22:              {
      23:                  forumParameter = new ObjectParameter("Forum", typeof(int));
      24:              }
      25:   
      26:              base.ExecuteFunction("ChangeForumID", threadParameter, forumParameter);
      27:          }
      28:      

         当然你手写也是可以的,不过数量多就很累了。希望这篇POST对您开发有帮助。


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    微信打开网址添加在浏览器中打开提示遮罩
    Java内存分配之堆、栈和常量池
    腾讯面试题04.进程和线程的区别?
    cookie 和 session的区别
    jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)
    HTTP中GET与POST的区别
    Socket send函数和recv函数详解
    JSP九大内置对象及四个作用域
    JavaScript
    网页布局(html+css基础)
  • 原文地址:https://www.cnblogs.com/wintersun/p/1878776.html
Copyright © 2020-2023  润新知