2011-12-12 3 views
0

these steps 다음 EF T4 코드 생성을 사용자 정의했습니다. 모두 좋지만 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가 매달려있다. 이 글을 쓰는 방식이 문제라면,이 사용자 정의 속성을 어떻게 추가해야하는지에 대해 올바른 방향으로 알려주십시오.

+0

어떻게 사용자 정의 했습니까? .edmx 파일을 저장 한 후에도 업데이트되지 않습니다? – Shymep

+0

나는 지금까지 추가 한 "코드"로 질문을 편집했습니다. – FelixMM

+0

@ JeffN825가 올바른 것을 말했습니다. ID 속성을 수동으로 추가해야하는 테이블의 ID 열은 무엇이 문제입니까? – Shymep

답변

1

디자이너가 생성하는 C# 코드가 아닌 edmx XML을 표시합니다. 따라서 생성 된 코드를 수정할 수는 있지만 디자이너가 표시하는 내용에는 영향을 미치지 않습니다.

추가 ... edmx XML 자체를 사용자 정의로 다시 작성하여 디자이너에 표시하려고하면 csdl, msl 및 ssdl에서 새 속성을 올바르게 매핑해야합니다 , 또는 edmx가 유효성을 검사하지 않습니다.

그런데 T4 템플릿을 사용하여 edmx xml을 수정하는 것은 그리 끔찍한 일이 아닙니다. 다음은 edmx가 저장 될 때마다 (데이터베이스 생성 파워 팩의 일부 템플릿을 사용하여) edmx를 TPH (계층 당 계층 구조) SSDL 및 MSL로 자동 생성 및 업데이트하는 예제입니다. 이것은 내 개체 생성 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); 
} 
#> 
+0

설명 주셔서 감사합니다. – FelixMM