【问题标题】:Getting the Schema from an EDMX file从 EDMX 文件中获取 Schema
【发布时间】:2010-10-19 17:03:21
【问题描述】:

我需要修改 T4 模板 POCO.tt 以从 EDMX 文件中检索数据库架构。我可以看到存储在 XML 中的 EntitySet 标记中的架构。但是,当使用 EntitySet 对象时,我无法在任何地方找到架构。

有人知道我在哪里可以找到数据库架构吗?

谢谢

【问题讨论】:

    标签: entity-framework-4 t4


    【解决方案1】:

    更新 我在一篇博文中写下了我的发现:

    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 属性的架构代码

    【讨论】:

    • 谢谢。我已经有一段时间没有编写过这组代码了,但这些信息仍然很有帮助。
    • code.Escape(entity) 应该只是 entity.Name 因为如果名称恰好是关键字,Escape 将添加 @。此外,这也不是万无一失的,因为您传递给 GetEntitySetByName 的名称来自 edmx:ConceptualModels 部分,而您实际上是在尝试在 edmx:StorageModels 下查找名称。这些不一定相同,并且映射在“C-S”映射部分下。不幸的是,没有简单的 API 可以阅读本节(请参阅 social.msdn.microsoft.com/Forums/en-US/…)。
    【解决方案2】:

    我想我第一次误解了你的问题。你检查过 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)中

    【讨论】:

      【解决方案3】:

      请参阅http://brewdawg.github.io/Tiraggo.Edmx/,您可以在 Visual Studio 中通过 NuGet 安装它,它会提供 Microsoft 对您隐藏的 EDMX 文件中的所有元数据,非常简单,效果很好。您想要访问所有低级别的存储信息,例如您的属性 SQL 类型、架构,它都在那里。您甚至可以使用 github 存储库中的 Sample Windows.Forms 应用设置断点并检查数据。

      【讨论】:

        【解决方案4】:

        我正在使用 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)#>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 2019-01-22
          • 2013-04-20
          • 2017-11-20
          • 2022-11-11
          • 2021-01-17
          • 1970-01-01
          相关资源
          最近更新 更多