我们知道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。
浙公网安备 33010602011771号