2008-11-20 6 views
1

J'ai créé un joli template T4 pour un modèle de référentiel pour mes entités. Au lieu d'analyser manuellement le fichier xml dans le fichier edmx, j'utilise EdmItemCollection pour créer une présentation de graphique d'objet pour le modèle conceptuel.Localisation des modificateurs d'accès getter et setter dans EdmItemCollection de Entity Framework

J'ai pu obtenir beaucoup d'informations sur ce modèle. Mais je ne peux pas trouver où trouver les modificateurs d'accès Getter et Setter. Ils sont présents dans la partie CSDL du fichier edmx.

Exemple:

<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" /> 

Où dans le graphe d'objet dois-je chercher ces informations?

Voici un exemple d'analyse de l'arborescence d'objets.

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(); 

J'espère que c'est clair dans quelle direction je vais.

Après un grand nombre de réflexions à travers le code de l'EdmItemCollection, il ne charge pas le schéma http://schemas.microsoft.com/ado/2006/04/codegeneration, il ignore donc ces propriétés. Mais j'espère que quelqu'un pourra m'aider à trouver comment trouver cette information?

Répondre

1

Merci à Noam Ben-Ami de Microsoft qui m'a indiqué l'article de blog Annotations in CSDL Je suis capable de répondre à ma propre question. Tout ce qui n'est pas directement présenté dans le modèle objet à partir des types Edm peut toujours être trouvé dans MetadataProperties (qui contient toutes les propriétés xml de l'élément, même celles qui sont représentées comme propriétés typées).

Je dois juste chercher un MetadataProperty dont le nom commence par "http://schemas.microsoft.com/ado/2006/04/codegeneration:" et je l'ai trouvé.

Pour répondre à mon exemple de code:

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(); 
Questions connexes