簡體   English   中英

EF Designer視圖與自定義T4模板之間的引用

[英]Reference between EF Designer view and custom T4 template

我按照以下步驟自定義了EF T4代碼生成。 一切都很好,但是似乎在EF Designer視圖中,您在其中將表視為“實體”以及屬性與表中的列之間的映射。 我的代碼顯示了我在T4模板中所做的更改,但設計人員沒有。 另外,如果我向設計器添加新表,它也不會更新代碼。 有什么我想念的嗎?

編輯:到目前為止,我已經完成的自定義操作是向每個生成的實體添加自定義屬性。 下面是T4代碼:

region.Begin(GetResourceString("Template_RegionPrimitiveProperties"));

    WriteLine("");
    Write("\t");
    WriteLine("[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]");
    Write("\t");
    WriteLine("[DataMemberAttribute()]");
    Write("\t");
    WriteLine("public Guid OriginalId { get; set; }");

    foreach (EdmProperty property in entity.Properties.Where(p => p.DeclaringType == entity && p.TypeUsage.EdmType is PrimitiveType))

所有的“ Write”和“ WriteLine”調用都是我自己的。 我知道這不是最好的方法,但是我仍然對T4持保留態度。 如果我寫此書的方式有問題,請向我指出如何添加此自定義屬性的正確方向。

設計器顯示的是edmx XML,而不是它生成的C#代碼。 因此,您可能正在修改生成的代碼...但這不會影響設計器顯示的內容。

進一步...如果您嘗試使用自定義重寫edmx XML本身,以使其確實顯示在設計器中,則必須確保在csdl,msl和ssdl或edmx中正確映射了新屬性。無法驗證。

順便說一句,使用T4模板修改edmx xml也不是那么糟糕。 這是我編寫的一個示例,該示例在保存edmx時(使用數據庫生成Power Pack中的某些模板)自動使用TPH(每個繼承關系的表)SSDL和MSL自動生成和更新edmx。 這存在於我的實體生成T4模板中,只要保存edmx就會調用該模板。

<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="System.Data.Entity.Design" #>
<#@ assembly name="$(DevEnvDir)Microsoft.Data.Entity.Design.DatabaseGeneration.dll"#>
<#@ assembly name="$(ProjectDir)..\..\Dependencies\Microsoft.Data.Entity.Design.DatabaseGenerationToolkit.dll"#>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.Common" #>
<#@ import namespace="System.Data.Entity.Design" #>
<#@ import namespace="System.Data.Metadata.Edm" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="Microsoft.Data.Entity.Design.DatabaseGeneration" #>
<#@ import namespace="Microsoft.Data.Entity.Design.DatabaseGenerationToolkit" #>
<#@ import namespace="System.Runtime.Remoting.Messaging" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="System.IO" #>
<#@ template language="C#" debug="true" hostspecific="true" #>
<#@ include file="GenerateTSQL.Utility.ttinclude"#>
<#@ include file="GenerateEDM.Utility.ttinclude"#>
<#@ output extension = ".xml" #>
<#
string inputFile = @"Model.edmx";

inputFile = Host.ResolvePath(inputFile);

var ssdlTransformPath = Host.ResolvePath(@"GenerateSSDL_TPH.tt");
var mslTransformPath = Host.ResolvePath(@"GenerateMSL_TPH.tt");

var document = new XmlDocument();
document.PreserveWhitespace = true;

document.Load(inputFile);
var namespaceManager = new XmlNamespaceManager(document.NameTable);
namespaceManager.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx");
namespaceManager.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl");

var schema = "model";
var schemaNode = document.SelectSingleNode("//edmx:DesignerProperty[@Name='DefaultDatabaseSchema']", namespaceManager);
if (schemaNode != null) schema = schemaNode.Attributes["Value"].Value;

var csdl = document.SelectSingleNode("//edmx:ConceptualModels", namespaceManager).InnerXml;

CallContext.SetData(EdmConstants.csdlInputName, csdl);
CallContext.SetData(EdmParameterBag.ParameterName.TargetVersion.ToString(), new Version("2.0.0.0"));
CallContext.SetData(EdmParameterBag.ParameterName.ProviderInvariantName.ToString(), "System.Data.SqlClient");
CallContext.SetData(EdmParameterBag.ParameterName.ProviderManifestToken.ToString(), "2005");
CallContext.SetData(EdmParameterBag.ParameterName.DatabaseSchemaName.ToString(), schema);
CallContext.SetData(EdmParameterBag.ParameterName.DatabaseName.ToString(), document.SelectSingleNode("//ssdl:EntityContainer", namespaceManager).Attributes["Name"].Value);
CallContext.SetData(EdmParameterBag.ParameterName.EdmxPath.ToString(), inputFile);

string ssdl = new Engine().ProcessTemplate(File.ReadAllText(ssdlTransformPath), Host);
var ssdlNode = document.SelectSingleNode("//edmx:StorageModels", namespaceManager);
ssdlNode.InnerXml = ssdl;

CallContext.SetData(EdmConstants.existingSsdlInputName, ssdl);
CallContext.SetData(EdmConstants.ssdlOutputName, ssdl);

string msl = new Engine().ProcessTemplate(File.ReadAllText(mslTransformPath), Host);
var mslNode = document.SelectSingleNode("//edmx:Mappings", namespaceManager);
mslNode.InnerXml = msl;

var isChanged = document.OuterXml != File.ReadAllText(inputFile);

if (isChanged) 
{
    document.Save(inputFile);
}
#>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM