在T4中检索列映射信息

时间:2012-08-23 19:30:56

标签: entity-framework-4.1 mapping t4

我正在研究一个基于实体模型生成.cs类的T4文件,而我想要达到的一个目标是模型中的映射信息。具体来说,对于模型中的每个字段,我正在尝试检索它映射到的数据库字段名称。

我发现映射信息显然存储在StorageMappingItemCollection中,但我无法确定如何查询它并检索我需要的数据。有没有人在这个班级工作过,可以提供指导吗?

到目前为止我的代码是这样的(我已将所有内容粘贴到有问题的行):

    <# 
        System.Diagnostics.Debugger.Launch(); 
        System.Diagnostics.Debugger.Break();
    #>

    <#@ template language="C#" debug="true" hostspecific="true"#>
    <#@ include file="EF.Utility.CS.ttinclude"#>
    <#@ output extension=".cs"#><#

    CodeGenerationTools code = new CodeGenerationTools(this);
    MetadataLoader loader = new MetadataLoader(this);
    CodeRegion region = new CodeRegion(this, 1);
    MetadataTools ef = new MetadataTools(this);

    string inputFile = @"MyModel.edmx";
    EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
    StoreItemCollection storeItemCollection = null;
    loader.TryCreateStoreItemCollection(inputFile, out storeItemCollection);
    StorageMappingItemCollection storageMappingItemCollection = null;
    loader.TryCreateStorageMappingItemCollection(
inputFile, ItemCollection, storeItemCollection, out storageMappingItemCollection);

    var item = storageMappingItemCollection.First();

storageMappingItemCollection有类似GetItem()之类的方法,但我不能在生命中让它返回我知道模型中存在的字段的数据。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

使用Linq to XML解析MSL并不是那么难

string mslManifestResourceName = GetMslName(ConfigurationManager.ConnectionStrings["Your Connection String"].ConnectionString);
var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(mslManifestResourceName);
XmlReader xreader = new XmlTextReader(stream);
XDocument doc = XDocument.Load(xreader);
XNamespace xmlns = "http://schemas.microsoft.com/ado/2009/11/mapping/cs";

var items = from entitySetMap in doc.Descendants(xmlns + "EntitySetMapping")
            let entityTypeMap = entitySetMap.Element(xmlns + "EntityTypeMapping")
            let mappingFragment = entityTypeMap.Element(xmlns + "MappingFragment")
            select new
            {
                EntitySet = entitySetMap.Attribute("Name").Value,
                TypeName = entityTypeMap.Attribute("TypeName").Value,
                TableName = mappingFragment.Attribute("StoreEntitySet").Value
            };

答案 1 :(得分:0)

将EDMX文件解析为XML而不是使用StorageMappingItemCollection可能更容易。