从EDMX文件获取架构

时间:2010-10-19 17:03:21

标签: entity-framework-4 t4

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

任何人都知道我会在哪里找到数据库架构?

由于

4 个答案:

答案 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)#>