Получение схемы из файла EDMX - PullRequest
3 голосов
/ 19 октября 2010

Мне нужно изменить шаблон T4 POCO.tt, чтобы получить схему базы данных из файла EDMX.Я вижу схему, хранящуюся в теге EntitySet в XML.Однако я нигде не могу найти схему при использовании объекта EntitySet.

Кто-нибудь знает, где я могу найти схему базы данных?

Ответы [ 4 ]

7 голосов
/ 28 апреля 2011

UPDATE Я написал свои выводы по этому вопросу в блоге:

http://www.ninjanye.co.uk/2011/06/getting-schema-information-from-edmx.html

http://jnye.co/Posts/3/getting-schema-information-from-an-edmx-file-with-poco

Я сам столкнулся с этой же проблемой. Сначала вам нужно извлечь EntityContainer из раздела «Содержимое модели хранения» (edmx: StorageModels) файла edmx

В верхней части шаблона tt (после создания экземпляра MetadataLoader и объявления inputFile) добавьте следующий код, чтобы получить EntityContainer содержимого модели хранения

StoreItemCollection sic;
loader.TryCreateStoreItemCollection(inputFile, out sic);
EntityContainer sicEntityContainer = sic.GetItems<EntityContainer>().First();

Затем из цикла foreach (var entity в ItemCollection.GetItems ...) вы можете получить текущую схему со следующей

EntitySet eset = sicEntityContainer.GetEntitySetByName(code.Escape(entity), true);
string schemaName = eset.MetadataProperties["Schema"].Value.ToString();

Примечание. Возможно, вам придется повторить код схемы get для свойств ComplexType ниже в шаблоне tt

1 голос
/ 20 октября 2010

Я думаю, что я неправильно понял ваш вопрос в первый раз.Рассматривали ли вы схему edmx для каких-либо подсказок?

По этой ссылке: http://msdn.microsoft.com/en-us/library/cc982042.aspx

Схема для приложений, предназначенных для .NET Framework версии 4, определена в MicrosoftФайл .Data.Entity.Design.Edmx_2.xsd.Схема для приложений, предназначенных для .NET Framework версии 3.5 с пакетом обновления 1 (SP1), определена в файле Microsoft.Data.Entity.Design.Edmx_1.xsd.

Они находятся в% VS100COMNTOOLS% \ .. \.. \ Xml \ Schemas \ для VS 2010 и% VS90COMNTOOLS% \ .. \ .. \ Xml \ Schemas \ (только 3.5) для VS 2008

0 голосов
/ 03 сентября 2015

Я работаю с EF6 и хотел добавить сводный комментарий к классам, генерируемым шаблоном t4. Поработав некоторое время, мне удалось это сделать, загрузив файл EDMX и используя XPath, чтобы найти то, что мне нужно.

var xmlContent = XDocument.Load(textTransform.Host.ResolvePath(inputFile));
var edmxNavigator = xmlContent.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(edmxNavigator.NameTable);
nsMgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2009/11/edmx");
nsMgr.AddNamespace("store", "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator");
nsMgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl");
nsMgr.AddNamespace("cs", "http://schemas.microsoft.com/ado/2009/11/mapping/cs");
//This is the loop that came with the default template
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
    fileManager.StartNewFile(entity.Name + ".cs");
    BeginNamespace(code);

    var mappingAttribute = edmxNavigator.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:Mappings/cs:Mapping/cs:EntityContainerMapping/cs:EntitySetMapping/cs:EntityTypeMapping[@TypeName=\"" + entity.FullName + "\"]/cs:MappingFragment/@StoreEntitySet", nsMgr);
    var entitySet = edmxNavigator.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityContainer/ssdl:EntitySet[@Name=\"" + mappingAttribute.Value + "\"]", nsMgr);
    var actualTableName  = (entitySet.SelectSingleNode("@Table") ?? entitySet.SelectSingleNode("@Name")).Value;
    var actualSchemaName = (entitySet.SelectSingleNode("@Schema", nsMgr) ?? entitySet.SelectSingleNode("@store:Schema", nsMgr)).Value;  

#>

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>

/// <summary>
/// Database Object: <#=actualSchemaName#>.<#=actualTableName#>
/// </summary>
<#=codeStringGenerator.EntityClassOpening(entity)#>
0 голосов
/ 23 сентября 2013

См. http://brewdawg.github.io/Tiraggo.Edmx/. Вы можете установить его через NuGet в Visual Studio, и он подает ВСЕ метаданные из ваших файлов EDMX, которые Microsoft скрывает от вас, очень просто, прекрасно работает. Вам нужен доступ ко всей этой низкоуровневой информации хранилища, такой как типы свойств SQL, схема, и все это есть. Вы даже можете использовать пример приложения Windows.Forms в репозитории github, чтобы установить точку останова и проверить данные.

...