3

我正在研究一个基于实体模型生成 .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() 之类的方法,但我一辈子都不能让它返回我知道模型中存在的字段的数据。

提前谢谢!

4

2 回答 2

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
            };
于 2012-12-21T23:43:54.780 回答
0

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

于 2012-08-24T08:09:24.250 回答