Нахождение модификаторов доступа получателя и установщика в EdmItemCollection Entity Framework - PullRequest
1 голос
/ 20 ноября 2008

Я создаю хороший шаблон T4 для шаблона репозитория для моих сущностей. Вместо того, чтобы вручную анализировать xml в файле edmx, я использую EdmItemCollection для создания представления графа объекта для концептуальной модели.

Мне удалось получить много информации из этой модели. Но я не могу найти, где найти модификаторы доступа Getter и Setter. Они присутствуют в CSDL-части файла edmx.

Пример:

<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, поэтому он просто игнорирует эти свойства.

Но я надеюсь, что кто-нибудь поможет мне найти эту информацию?

1 Ответ

1 голос
/ 21 ноября 2008

Спасибо Ноаму Бен-Ами из Microsoft, который указал мне на сообщение в блоге Аннотации в CSDL Я могу ответить на свой вопрос.

Все, что непосредственно не представлено в объектной модели из типов Edm, все еще можно найти в MetadataProperties (который содержит каждое свойство xml элемента, даже те, которые представлены как типизированные свойства).

Мне просто нужно найти MetadataProperty, имя которого начинается с "http://schemas.microsoft.com/ado/2006/04/codegeneration:", и я нашел его.

Чтобы ответить на мой пример кода:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...