2010-09-09 13 views

Trả lời

46

Bạn cần mở tệp model1.tt (hoặc bất kỳ thứ gì được gọi trong dự án của bạn) và thêm một vài thứ.

Xác định vị trí các dòng mã (dòng 34, trong trường hợp của tôi):

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

Ngay trước dòng này ở đây:

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

bạn cần phải thêm [DataContract] thuộc tính:

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

vào mẫu của bạn.

Tiếp theo, xác định vị trí dòng mã này:

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

Trước khi dòng đó, thêm thuộc tính [DataMember] cho mẫu của bạn:

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

này sẽ thêm những thuộc tính cho tất cả các đơn vị và tất cả các bất động sản - đó có thể không phải là những gì bạn thực sự muốn, nhưng đó là một sự khởi đầu.

Ngoài ra: để kết thúc, bạn có thể muốn có một cái nhìn tại WriteHeader chức năng trong mẫu T4 của bạn, và thêm báo cáo kết quả using System.Runtime.Serialization; vào danh sách các usings:

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

Cảm ơn bạn, chính xác những gì tôi cần, tôi nghĩ tôi có thể bắt đầu hiểu T4 từng phút, tôi chỉ cần một số bản sửa lỗi nhanh ngay bây giờ. Xin vui lòng bạn có thể cung cấp một số trợ giúp về nơi tôi thêm bằng cách sử dụng không gian tên trên mỗi thực thể? –

+0

Tôi đã tìm thấy nó, cảm ơn bạn. –

+0

@gtas: cập nhật câu trả lời của tôi - bạn sẽ cần bao gồm thêm không gian tên 'System.Runtime.Serialization' để xử lý các thuộc tính DataContract/DataMember –

1

Trong EF6.1 bạn cần để chỉnh sửa model1.tt và thêm thẻ giữa UseDirectives và EntityClassOpening:

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