Locating the getter and setter access modifiers in the EdmItemCollection of Entity Framework

Question!

I've been creating a nice T4 template for a repository pattern for my entities. Instead of manually parsing the xml in the edmx file I use the EdmItemCollection to create a object graph presentation for the conceptual model.

I've been able to get a lot of information out of this model. But I cant find where to locate the Getter and Setter access modifiers. They are present in the CSDL part of the edmx file.

Example:

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

Where in the object graph should I look for this information?

Here is an example of how I parse the object tree.

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

I hope it's clear in which direction I'm going.

After a lot of reflectoring trough the code of the EdmItemCollection that it doesn't load the http://schemas.microsoft.com/ado/2006/04/codegeneration schema, so it just ignores those properties.

But I'm hoping somebody can help me find out how to locate this information?



Answers

Thanks to Noam Ben-Ami from Microsoft who pointed me to the blog post Annotations in CSDL I'm able to answered my own question.

Everything which is not directly presented in the Object Model from the Edm types can still be found in the MetadataProperties (which contains every xml property of the element, even the ones which are represented as typed properties).

I just have to look for a MetadataProperty which name begins with "http://schemas.microsoft.com/ado/2006/04/codegeneration:" and I've found it.

To answer my code example:

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


In Python:

con = sqlite3.connect('database.db')
cursor = con.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
print(cursor.fetchall())

Watch out for my other answer. There is a much faster way using pandas.



The FASTEST way of doing this in python is using Pandas (version 0.16 and up).

Dump one table:

db = sqlite3.connect('database.db')
table = pd.read_sql_query("SELECT * from table_name", db)
table.to_csv(table_name + '.csv', index_label='index')

Dump all tables:

import sqlite3
import pandas as pd


def to_csv():
    db = sqlite3.connect('database.db')
    cursor = db.cursor()
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    for table_name in tables:
        table_name = table_name[0]
        table = pd.read_sql_query("SELECT * from %s" % table_name, db)
        table.to_csv(table_name + '.csv', index_label='index')


This video can help you solving your question :)
By: admin