1

私は自分のエンティティのリポジトリ パターン用の素敵な T4 テンプレートを作成しています。edmx ファイルの xml を手動で解析する代わりに、EdmItemCollection を使用して、概念モデルのオブジェクト グラフ プレゼンテーションを作成します。

このモデルから多くの情報を得ることができました。しかし、Getter および Setter アクセス修飾子を見つける場所が見つかりません。これらは、edmx ファイルの CSDL 部分にあります。

例:

<Property Name="CustomerID" Type="String" Nullable="false" MaxLength="5" Unicode="true" FixedLength="true" 
    a:SetterAccess="Public" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" />

オブジェクト グラフのどこでこの情報を探す必要がありますか?

オブジェクト ツリーを解析する方法の例を次に示します。

EdmItemCollection edmItems = new EdmItemCollection(new XmlReader[] { csdlReader });
var ownEntities = from item in edmItems
                  where item.BuiltInTypeKind == BuiltInTypeKind.EntityType
                  select item as EntityTypeBase;

Entities = (from ent in ownEntities // Entities is a property, therefore no declaration
            select new Entity
            {
                Name = ent.Name,
                SetName = (from entSet in entityContainer.BaseEntitySets
                           where (entSet.ElementType == ent) || (ent.BaseType != null && (entSet.ElementType.FullName.Equals(ent.BaseType.FullName)))
                           select entSet.Name).FirstOrDefault(),
                Keys = (from keys in ent.KeyMembers
                        select new Entity.Member
                        {
                            Name = keys.Name,
                            Type = keys.TypeUsage.EdmType.Name 
                        }).ToList(),
                Properties = (from prop in ent.Members
                              select new Entity.Member
                              {
                                  Name = prop.Name,
                                  Type = prop.TypeUsage.EdmType.Name,
                                  IsCollection = prop.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.CollectionType
                              }).ToList()
            }).ToList();

私がどちらの方向に向かっているのかが明確になることを願っています。

EdmItemCollection のコードを何度も反映した後、http: //schemas.microsoft.com/ado/2006/04/codegenerationスキーマが読み込まれないため、これらのプロパティは無視されます。

しかし、誰かがこの情報を見つける方法を見つけるのを手伝ってくれることを願っています?

4

1 に答える 1

1

Microsoft の Noam Ben-Ami がブログ投稿Annotations in CSDLを教えてくれたおかげで、私自身の質問に答えることができました。

Edm 型からオブジェクト モデルに直接表示されないものはすべて、MetadataProperties (要素のすべての xml プロパティを含み、型付きプロパティとして表されるものも含む) で見つけることができます。

名前が「 http://schemas.microsoft.com/ado/2006/04/codegeneration :」で始まる MetadataProperty を探すだけで、見つけました。

私のコード例に答えるには:

String codeGenerationXmlns = "http://schemas.microsoft.com/ado/2006/04/codegeneration";
EdmItemCollection edmItems = new EdmItemCollection(new XmlReader[] { csdlReader });
var ownEntities = from item in edmItems
                  where item.BuiltInTypeKind == BuiltInTypeKind.EntityType
                  select item as EntityTypeBase;
var entityContainer = (from item in edmItems
                       where item.BuiltInTypeKind == BuiltInTypeKind.EntityContainer
                       select item as EntityContainer).FirstOrDefault();
Entities = (from ent in ownEntities
            select new Entity
            {
                Name = ent.Name,
                SetName = (from entSet in entityContainer.BaseEntitySets
                           where (entSet.ElementType == ent) || (ent.BaseType != null && (entSet.ElementType.FullName.Equals(ent.BaseType.FullName)))
                           select entSet.Name).FirstOrDefault(),
                IsPublic = ((from metaProps in ent.MetadataProperties
                             where metaProps.Name.Equals(codeGenerationXmlns + ":TypeAccess")
                             select metaProps.Value).FirstOrDefault() ?? "Public").Equals("Public"),
                Keys = (from keys in ent.KeyMembers
                        select new Entity.Member
                        {
                            Name = keys.Name,
                            Type = keys.TypeUsage.EdmType.Name
                        }).ToList(),
                Properties = (from prop in ent.Members
                              select new Entity.Member
                              {
                                  Name = prop.Name,
                                  Type = prop.TypeUsage.EdmType.Name,
                                  IsCollection = prop.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.CollectionType,
                                  PrivateGetter = ((from metaProps in prop.MetadataProperties
                                                    where metaProps.Name.Equals(codeGenerationXmlns + ":GetterAccess")
                                                    select metaProps.Value).FirstOrDefault() ?? "Public").Equals("Private"),
                                  PrivateSetter = ((from metaProps in prop.MetadataProperties
                                                    where metaProps.Name.Equals(codeGenerationXmlns + ":SetterAccess")
                                                    select metaProps.Value).FirstOrDefault() ?? "Public").Equals("Private"),
                              }).ToList()
            }).ToList();
于 2008-11-21T10:12:52.407 に答える