3

エンティティ モデルに基づいて .cs クラスを生成する T4 ファイルに取り組んでいます。取得しようとしているものの 1 つは、モデル内のマッピング情報です。具体的には、モデルの各フィールドについて、マップ先のデータベース フィールド名を取得しようとしています。

マッピング情報は明らかに 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() などのメソッドがありますが、モデルに存在することがわかっているフィールドのデータを返すことはできません。

事前にt​​hx!

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

StorageMappingItemCollection を使用するよりも、EDMX ファイルを XML として解析する方が簡単な場合があります。

于 2012-08-24T08:09:24.250 に答える