我需要修改T4模板POCO.tt以从EDMX文件中检索数据库模式。我可以看到存储在XML中的EntitySet标记中的模式。但是,在使用EntitySet对象时,我无法在任何地方找到架构。
任何人都知道我会在哪里找到数据库架构?
由于
答案 0 :(得分:7)
<强>更新强> 我在博客文章中写了我的发现:
http://www.ninjanye.co.uk/2011/06/getting-schema-information-from-edmx.html
http://jnye.co/Posts/3/getting-schema-information-from-an-edmx-file-with-poco
我自己也遇到过同样的问题。 首先,您需要从edmx文件的存储模型内容(edmx:StorageModels)部分检索EntityContainer
在tt模板的顶部(在实例化MetadataLoader并声明inputFile之后)添加以下代码以获取存储模型内容EntityContainer
StoreItemCollection sic;
loader.TryCreateStoreItemCollection(inputFile, out sic);
EntityContainer sicEntityContainer = sic.GetItems<EntityContainer>().First();
然后从foreach(ItemCollection.GetItems中的var实体...)循环中,您可以使用以下
获取当前模式EntitySet eset = sicEntityContainer.GetEntitySetByName(code.Escape(entity), true);
string schemaName = eset.MetadataProperties["Schema"].Value.ToString();
注意:您可能必须重复tt模板中较低的ComplexType属性的get模式代码
答案 1 :(得分:1)
我想我第一次误解了你的问题。你有没有检查过edmx架构的任何线索?
根据此链接:http://msdn.microsoft.com/en-us/library/cc982042.aspx
应用程序的架构 目标.NET Framework版本4是 定义在 Microsoft.Data.Entity.Design.Edmx_2.xsd 文件。应用程序的架构 针对.NET Framework 3.5版 SP1定义于 Microsoft.Data.Entity.Design.Edmx_1.xsd 文件。
对于VS 2010,它们位于%VS100COMNTOOLS%\ .. \ .. \ Xml \ Schemas \中,VS 2008中的%VS90COMNTOOLS%\ .. \ .. \ Xml \ Schemas \(仅限3.5)
答案 2 :(得分:0)
请参阅http://brewdawg.github.io/Tiraggo.Edmx/,您可以在Visual Studio中通过NuGet安装它,它可以提供Microsoft隐藏的EDMX文件中的所有元数据,非常简单,效果很好。您希望访问所有低级别存储信息,例如属性SQL类型,架构,它就在那里。您甚至可以使用github存储库中的示例Windows.Forms应用程序来设置断点并检查数据。
答案 3 :(得分:0)
我正在使用EF6,并希望为t4模板生成的类添加摘要注释。在黑客攻击了一段时间之后,我设法通过加载EDMX文件并使用XPath来找到我需要的东西。
var xmlContent = XDocument.Load(textTransform.Host.ResolvePath(inputFile));
var edmxNavigator = xmlContent.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(edmxNavigator.NameTable);
nsMgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx");
nsMgr.AddNamespace("store", "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator");
nsMgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl");
nsMgr.AddNamespace("cs", "http://schemas.microsoft.com/ado/2009/11/mapping/cs");
//This is the loop that came with the default template
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
var mappingAttribute = edmxNavigator.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:Mappings/cs:Mapping/cs:EntityContainerMapping/cs:EntitySetMapping/cs:EntityTypeMapping[@TypeName=\"" + entity.FullName + "\"]/cs:MappingFragment/@StoreEntitySet", nsMgr);
var entitySet = edmxNavigator.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityContainer/ssdl:EntitySet[@Name=\"" + mappingAttribute.Value + "\"]", nsMgr);
var actualTableName = (entitySet.SelectSingleNode("@Table") ?? entitySet.SelectSingleNode("@Name")).Value;
var actualSchemaName = (entitySet.SelectSingleNode("@Schema", nsMgr) ?? entitySet.SelectSingleNode("@store:Schema", nsMgr)).Value;
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
/// <summary>
/// Database Object: <#=actualSchemaName#>.<#=actualTableName#>
/// </summary>
<#=codeStringGenerator.EntityClassOpening(entity)#>