2010-09-09 102 views

回答

46

你需要打開你的model1.tt文件(或者在你的項目中調用的任何文件),並添加一些東西。

找到這些代碼行(第34行,在我的情況):

// Emit Entity Types 
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) 
{ 
    fileManager.StartNewFile(entity.Name + ".cs"); 

這條線在這裏就在:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> 

你需要添加[DataContract]屬性:

[DataContract] 
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> 

到您的模板。

接下來,找到下面這行代碼:

<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#> 

該行之前,[DataMember]屬性添加到您的模板:

[DataMember] 
<#=PropertyVirtualModifier(Accessibility.ForProperty(edmProperty))#> <#=code.Escape(edmProperty.TypeUsage)#> <#=code.Escape(edmProperty)#> 

這將增加對所有實體和所有屬性的屬性 - 這可能不是你真正想要的,但這是一個開始。

另外:玩完,你可能想看看在你的T4模板WriteHeader功能,並添加using System.Runtime.Serialization;語句將usings的列表:

using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.Runtime.Serialization; // add this to handle DataContract/DataMember 
+1

謝謝,正是我需要的,我想我可能會開始明白一分T4分鐘,我只是需要一些修復快速的現在。請你可以提供一些幫助,我在哪裏添加使用名稱空間在每個實體? – 2010-09-09 15:59:16

+0

我找到了,謝謝。 – 2010-09-09 16:04:04

+0

@gtas:更新了我的答案 - 您需要包含額外的命名空間'System.Runtime.Serialization'來處理DataContract/DataMember屬性 – 2010-09-09 16:06:57

1

在EF6.1你需要編輯model1.tt和UsingDirectives和EntityClassOpening之間添加標籤:

<#=codeStringGenerator.UsingDirectives(inHeader: false)#> 
//MY TAG: 
[Serializable] 
<#=codeStringGenerator.EntityClassOpening(entity)#>