(Sử dụng Visual Studio 2013 trở lên)
Để tránh việc chỉnh sửa hàm tạo lớp trong mô hình EF của bạn mỗi khi bạn làm mới mô hình từ cơ sở dữ liệu hoặc một số cách khác kích hoạt xây dựng lại mã, vị trí thích hợp để thực hiện thay đổi là trong tệp mã T4 chịu trách nhiệm thực sự tạo mã mô hình. Tôi đã gặp một số vấn đề khác với các thuộc tính động một vài năm trước khi tôi hiểu cơ chế cơ bản về cách các lớp và thuộc tính thực sự được tạo ra. T4 !!! Thật là kỳ diệu: Cú pháp-D T4 thoạt đầu có thể hơi đáng sợ, vì vậy việc đọc kỹ cú pháp là điều khôn ngoan. RẤT tập trung khi thực hiện thay đổi cũng là một ý kiến hay :-)
Vì thế! Nếu bạn nhìn vào mô hình của mình, bạn có tệp .tt dưới tệp .edmx của bạn. Tệp .tt (T4) này là tập lệnh thực sự tạo ra lớp mô hình của bạn. Tập lệnh sẽ được chạy tự động mỗi khi bạn xây dựng mô hình của mình hoặc thực hiện một số thay đổi trong trình chỉnh sửa mô hình.
Giả sử bộ mô tả Mô hình của bạn có tên là Model1.edmx . Bạn sẽ có một tệp có tên Model1.Context.tt trong cây bên dưới nó. Bạn cũng sẽ thấy tệp Model1.Context.cs . Đây rõ ràng là tệp mã thực cho ngữ cảnh của bạn. Nhưng tệp này là kết quả của tệp kịch bản .tt đang được chạy ! Nó được tạo hoàn toàn động. Vì vậy, không có ý tưởng chỉnh sửa nó.
Mở tệp .tt và bạn sẽ thấy một cái gì đó như:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension=".cs"#><#
const string inputFile = @"Model1.edmx";
var textTransform = DynamicTextTransformation.Create(this);
..
..
Còn khoảng 50 dòng nữa, mã khởi tạo đang được tập lệnh.
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>
using System.Data.Entity.Core.Objects;
using System.Linq;
<#
}
#>
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
base.Configuration.ProxyCreationEnabled = false;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
}
Tôi đã thêm thuộc tính base.Configuration.ProxyCreationEnabled = false;
để nó sẽ là dòng đầu tiên trong hàm tạo.
Lưu tệp của bạn và mở tệp Model1.Context.cs để xem mã kết quả. Nếu bạn muốn buộc chạy tập lệnh mẫu, hãy chọn menu
Xây dựng - Định dạng tất cả các mẫu T4
Thật dễ dàng để biết liệu bạn có mắc lỗi trong mã T4 của mình hay không, vì tệp .cs sẽ hoàn toàn không được tạo hoặc có lỗi rõ ràng nếu bạn mở nó trong trình chỉnh sửa.