您的位置:首页 > 编程语言

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

2010-11-16 17:56 447 查看
我们知道EntityFramework4默认根据MODEL生成ServerCode,现在我们使用POCOT4模板。有个小问题,对于那些FunctionImport的存储过程没有返回值,却没有生成相应的CODE。主要生成于一个DataContext下,通常是XXXXX.Context.tt的模板。打开模板,你可以找到这么一行代码:

if(edmFunction.ReturnParameter==null)

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

<#
//*********************************************************
//
//Copyright(c)Microsoft.Allrightsreserved.
//ThiscodeislicensedundertheMicrosoftPublicLicense.
//THISCODEISPROVIDED*ASIS*WITHOUTWARRANTYOF
//ANYKIND,EITHEREXPRESSORIMPLIED,INCLUDINGANY
//IMPLIEDWARRANTIESOFFITNESSFORAPARTICULAR
//PURPOSE,MERCHANTABILITY,ORNON-INFRINGEMENT.
//
//*********************************************************
#>
<#@templatelanguage="C#"debug="false"hostspecific="true"#>
<#@includefile="EF.Utility.CS.ttinclude"#><#@
outputextension=".cs"#><#
CodeGenerationToolscode=newCodeGenerationTools(this);
MetadataToolsef=newMetadataTools(this);
MetadataLoaderloader=newMetadataLoader(this);
CodeRegionregion=newCodeRegion(this);
stringinputFile=@"model.edmx";
EdmItemCollectionItemCollection=loader.CreateEdmItemCollection(inputFile);
stringnamespaceName=code.VsNamespaceSuggestion();
EntityContainercontainer=ItemCollection.GetItems<EntityContainer>().FirstOrDefault();
if(container==null)
{
return"//NoEntityContainerexistsinthemodel,sonocodewasgenerated";
}
#>
//------------------------------------------------------------------------------
//<auto-generated>
//Thiscodewasgeneratedfromatemplate.
//
//Changestothisfilemaycauseincorrectbehaviorandwillbelostif
//thecodeisregenerated.
//</auto-generated>
//------------------------------------------------------------------------------
usingSystem;
usingSystem.Data.Objects;
usingSystem.Data.EntityClient;
<#
if(!String.IsNullOrEmpty(namespaceName))
{
#>
namespace<#=code.EscapeNamespace(namespaceName)#>
{
<#
PushIndent(CodeRegion.GetIndent(1));
}
#>
<#=Accessibility.ForType(container)#>partialclass<#=code.Escape(container)#>:ObjectContext
{
publicconststringConnectionString="name=<#=container.Name#>";
publicconststringContainerName="<#=container.Name#>";
#regionConstructors
public<#=code.Escape(container)#>()
:base(ConnectionString,ContainerName)
{
<#
WriteLazyLoadingEnabled(container);
#>
}
public<#=code.Escape(container)#>(stringconnectionString)
:base(connectionString,ContainerName)
{
<#
WriteLazyLoadingEnabled(container);
#>
}
public<#=code.Escape(container)#>(EntityConnectionconnection)
:base(connection,ContainerName)
{
<#
WriteLazyLoadingEnabled(container);
#>
}
#endregion
<#
region.Begin("ObjectSetProperties",2);
foreach(EntitySetentitySetincontainer.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#>"));}
}
privateObjectSet<<#=code.Escape(entitySet.ElementType)#>><#=code.FieldName(entitySet)#>;
<#
}
region.End();
region.Begin("FunctionImports");
foreach(EdmFunctionedmFunctionincontainer.FunctionImports)
{
varparameters=FunctionImportParameter.Create(edmFunction.Parameters,code,ef);
stringparamList=String.Join(",",parameters.Select(p=>p.FunctionParameterType+""+p.FunctionParameterName).ToArray());
stringreturnTypeElement="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(varparameterinparameters)
{
if(!parameter.NeedsLocalVariable)
{
continue;
}
#>
ObjectParameter<#=parameter.LocalVariableName#>;
if(<#=parameter.IsNullableOfT?parameter.FunctionParameterName+".HasValue":parameter.FunctionParameterName+"!=null"#>)
{
<#=parameter.LocalVariableName#>=newObjectParameter("<#=parameter.EsqlParameterName#>",<#=parameter.FunctionParameterName#>);
}
else
{
<#=parameter.LocalVariableName#>=newObjectParameter("<#=parameter.EsqlParameterName#>",typeof(<#=parameter.RawClrTypeName#>));
}
<#
}
if(edmFunction.ReturnParameter==null)
{
#>
base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(",",String.Join(",",parameters.Select(p=>p.ExecuteParameterName).ToArray()))#>);
}
<#
}
else
{
#>
returnbase.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(",",String.Join(",",parameters.Select(p=>p.ExecuteParameterName).ToArray()))#>);
}
<#
}
}
region.End();
#>
}
<#
if(!String.IsNullOrEmpty(namespaceName))
{
PopIndent();
#>
}
<#
}
#>
<#+
privatevoidWriteLazyLoadingEnabled(EntityContainercontainer)
{
stringlazyLoadingAttributeValue=null;
stringlazyLoadingAttributeName=MetadataConstants.EDM_ANNOTATION_09_02+":LazyLoadingEnabled";
if(MetadataTools.TryGetStringMetadataPropertySetting(container,lazyLoadingAttributeName,outlazyLoadingAttributeValue))
{
boolisLazyLoading=false;
if(bool.TryParse(lazyLoadingAttributeValue,outisLazyLoading))
{
#>
this.ContextOptions.LazyLoadingEnabled=<#=isLazyLoading.ToString().ToLowerInvariant()#>;
<#+
}
}
}
#>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

publicpartialclassEntities:ObjectContext
{
publicvoidChangeForumID(stringthread,Nullable<int>forum)
{
ObjectParameterthreadParameter;
if(thread!=null)
{
threadParameter=newObjectParameter("Thread",thread);
}
else
{
threadParameter=newObjectParameter("Thread",typeof(string));
}
ObjectParameterforumParameter;
if(forum.HasValue)
{
forumParameter=newObjectParameter("Forum",forum);
}
else
{
forumParameter=newObjectParameter("Forum",typeof(int));
}
base.ExecuteFunction("ChangeForumID",threadParameter,forumParameter);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

作者:PetterLiu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-PetterLiuBlog。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: