2011-11-10 32 views
14

Tôi đã ghi đè các mẫu T4 thế hệ bộ điều khiển (ControllerWithContext.tt) như được mô tả here.
Tôi muốn tận dụng lợi thế của các tiện ích trợ giúp mã được tìm thấy trong EF.utility.CS.ttinclude như được sử dụng trong mẫu máy phát mẫu T4 của máy phát điện POCO. Do đó, tôi đã sao chép các dòng sau từ số Model.tt của mình vào số ControllerWithContext.tt.Lỗi mẫu T4: tải tệp bao gồm ef.utility.cs.ttinclude trả về một chuỗi rỗng hoặc trống

<#@ include file="EF.Utility.CS.ttinclude"#> 

Tuy nhiên, khi tôi cố gắng thêm một bộ điều khiển Tôi nhận được thông báo lỗi

Loading the include file 'EF.utility.CS.ttinclude' returned a null or empty string

Theo MSDN documentation, lỗi này là bởi vì các tập tin bao gồm là trống, mà nó rõ ràng không phải là bởi vì nó hoạt động với Model.tt

sự khác biệt duy nhất tôi có thể thấy là ghi đè ControllerWithContext.tt không có một công cụ Custom xác định, trong khi Model.tt có nó thiết lập để TextTemplatingFileGenerator.

workaround của tôi là để sao chép các chức năng tôi cần từ ef.utility.cs.ttinclude vào ControllerWithContext.tt của tôi, mà tự nó đã ném lên nhiều lỗi nhưng đã được dễ dàng giải quyết.

Làm cách nào để đưa mẫu T4 mà không có công cụ tùy chỉnh được xác định?

Trả lời

2

Câu trả lời là bộ xử lý mẫu thậm chí không cố gắng lấy tệp bao gồm (như được xác nhận bằng cách sử dụng ProcMon). Bạn có thể tạo lại mẫu này bằng cách sử dụng bất kỳ mẫu nào, không chỉ EF.Utility.CS.ttinlcude

Không chắc chắn lý do bạn cần mã nhưng bạn luôn có thể tạo lớp cơ sở của riêng mình, chỉ có nó kế thừa từ Microsoft.VisualStudio.TextTemplating. TextTransformation và sau đó đặt trong tất cả các mã đó là trong tập tin EF.Utility. Sau đó, thiết lập chỉ thị kế thừa để trỏ đến lớp cơ sở mới của bạn và sau đó bạn có thể truy cập các phương thức đó từ mẫu của bạn.

+0

Cảm ơn. Như tôi đã đề cập, tôi muốn tận dụng lợi thế của lớp 'CodeGenerationTools' được tìm thấy trong' ef.utility.cs.ttinclude' trong các mẫu T4 của riêng tôi. – Webbie4

+0

Chỉ cần làm theo những gì tôi đề xuất và bạn có thể, chỉ cần không bằng cách sử dụng một bao gồm (ít nhất là bây giờ vì nó có vẻ là bị hỏng) –

+0

@DustinDavis: bạn có nói rằng '<# @ include file =" ... "#> 'chỉ đơn giản là không hoạt động? –

10

Sau lời khuyên @DustinDavis', và sử dụng những thông tin vô giá được tìm thấy trên OlegSych's site, đây là những gì tôi đã làm:

  • Tạo một dự án mới mang tên CodeGenerationTools.
  • Added dự án tài liệu tham khảo để

    • System.Data.Entity.Design
    • EnvDTE
    • System.Data.Entity
    • Microsoft.VisualStudio.TextTemplating.10.0

    Đối tài liệu tham khảo cuối cùng này tôi đã phải cài đặt phiên bản chính xác của Visual Studio SDK

  • Sao chép tệp EF.Utility.CS.ttinclude vào dự án.
  • Đổi tên thành CodeGenerationTools.cs
  • Chỉnh sửa các tập tin và chuyển đổi tất cả <#@ import namespace="<name>" #> để using <name>;
  • Deleted khai mạc và bế <#+ #>
  • gia tăng các chỉ thị using Microsoft.VisualStudio.TextTemplating;
  • mở rộng các lớp:

    public class CodeGenerationTools : TextTransformation 
    
  • Override các TransformText phương pháp

    public override string TransformText() { 
        throw new NotImplementedException(); 
    } 
    
  • Thêm constructor rỗng

    public CodeGenerationTools() { 
        _textTransformation = DynamicTextTransformation.Create(this); 
        _code = new CSharpCodeProvider(); 
        _ef = new MetadataTools(_textTransformation); 
        FullyQualifySystemTypes = false; 
        CamelCaseFields = true; 
    } 
    
  • Cuối cùng, xây dựng dự án này.

Các bước tiếp theo đã diễn ra trong dự án chính - Đã chỉnh sửa tệp mẫu T4. - Thay đổi chỉ thị mẫu để

<#@ template language="C#" HostSpecific="True" debug="false" inherits="CodeGenerationTools"#> 

- Thêm các chỉ thị

<#@ assembly name="C:\Visual Studio 2010\Projects\CodeGenerationTools\CodeGenerationTools\bin\Debug\CodeGenerationTools.dll" #> 
    <#@ import namespace="CodeGenerationTools" #> 

Tất cả số đó bây giờ có nghĩa là tôi có thể sử dụng các phương pháp helper tìm thấy trong EF.Utility.CS.ttinclude trong các mẫu T4 của riêng tôi, và tôi có phương tiện để thêm các phương thức trợ giúp của riêng tôi sẽ có sẵn cho tất cả các dự án.

4

Nếu bạn có Visual Studio 2012 hoặc 2013, hãy cài đặt this EF tool để khắc phục lỗi.

+0

Câu trả lời của bạn đã lưu tôi. thực sự cảm ơn sự giúp đỡ. Bạn phải trả lời # 1 –

+0

vẫn cấp cho tôi – RezaRahmati

Các vấn đề liên quan