2015-06-01 4 views
1

Я пытаюсь добиться создания динамических моделей ORM с использованием языка C#. Мне нужно это из-за задач в моей работе.Как сгенерировать файлы CSDL и MSL программно?

Я достиг, как создать файл SSDL программно в C#. Я использую EntityStoreSchemaGenerator класс, который записывает данные таким образом:

var store = new EntityStoreSchemaGenerator(providerInvariantName, connectionString, "ShoppingModel"); 
store.GenerateStoreMetadata(); 
store.WriteStoreSchema(filePath); 

Я могу показать вам пример файла SSDL я получил: http://pastebin.com/3U4A6fY9

Это нормально, но как насчет того, чтобы получить CSDL и MSL файлы?

Как я понял, для генерации CSDL и MSL-файлов необходимо использовать класс EntityModelSchemaGenerator для использования с пространством имен System.Data.Entity.Design.

Если посмотреть на https://msdn.microsoft.com/en-us/library/system.data.entity.design.entitymodelschemagenerator_methods(v=vs.110).aspx

Есть несколько методов:

  • WriteModelSchema (String) Записывает сгенерированный концептуальный язык определения схемы (CSDL) в указанный файл.
  • WriteModelSchema (XmlWriter) Записывает сгенерированный язык определения концептуальной схемы (CSDL) в объект XmlWriter.
  • WriteStorageMapping (String) Записывает сгенерированный язык спецификации сопоставления (MSL) в указанный файл.
  • WriteStorageMapping (XmlWriter) Записывает сгенерированный язык спецификации сопоставления (MSL) в объект XmlWriter.

, которые могут быть использованы для создания необходимых файлов (CSDL & & MSL). Но я довольно смущен ... Как сгенерировать их, если EntityModelSchemaGenerator требуется конструктор System.Data.Metadata.Edm.EntityContainer.

Как я понял, я должен подготовить контейнер объекта, используя класс EntityConnection.

Но как я могу создать соединение с сущностью, которое требует, чтобы все файлы метаданных были уже созданы (* .csdl, * .ssdl, * .msl), если моя цель - создать * .csdl & * .msl файлы ранее?

Так что я не могу использовать EntityModelSchemaGenerator, пока не создам все файлы метаданных? Итак, каков способ создания файлов * .csdl и * .msl (файл * .ssdl)?

ответ

1

Я решил свою проблему с помощью

Models = new EntityModelSchemaGenerator(Store.StoreItemCollection, "ShoppingModelConceptual", "ShoppingModelConceptualContainer");

, который основан на заранее подготовленной коллекции магазина пункт.

http://pastebin.com/B0gbzuin

using System; 
using System.Data.Common; 
using System.Data.SqlClient; 
using System.Data.Entity; 
using System.Data.EntityClient; 
using System.Data.Entity.Design; 
using System.Data.Entity.Infrastructure; 

namespace DynamicOrm1 
{ 
    class Generators 
    { 
     internal EntityModelSchemaGenerator Models { get; set; } 
     internal EntityClassGenerator Classes { get; set; } 
     internal EntityCodeGenerator Code { get; set; } 
     internal EntityViewGenerator Views { get; set; } 
     internal EntityStoreSchemaGenerator Store { get; set; } 

     const string connectionString = "Server = MSSQL2014; Database = test.shop; Trusted_Connection = True;"; 
     const string providerInvariantName = "System.Data.SqlClient"; 

     public Generators() 
     { 
      InitializeSettings(); 
     } 

     private void InitializeSettings() 
     { 
      Classes = new EntityClassGenerator(LanguageOption.GenerateCSharpCode); 
      Code = new EntityCodeGenerator(LanguageOption.GenerateCSharpCode); 
      Views = new EntityViewGenerator(LanguageOption.GenerateCSharpCode); 
      Store = new EntityStoreSchemaGenerator(providerInvariantName, connectionString, "ShoppingModelStore"); 

      Store.GenerateForeignKeyProperties = true; 
     } 

     internal void CreateSsdlFile(string filePath) 
     { 
      if (filePath == String.Empty) 
       throw new Exception("Can't create the SSDL file, because the given file path is an empty string."); 

      Store.GenerateStoreMetadata(); 
      Store.WriteStoreSchema(filePath); 
     } 

     internal void CreateCsdlAndMslFile(string csdlFilePath, string mslFilePath) 
     { 
      if (Store == null) 
       throw new Exception("Can't create the CSDL and MSL files, because the `Store` object is null."); 

      Models = new EntityModelSchemaGenerator(Store.StoreItemCollection, "ShoppingModelConceptual", "ShoppingModelConceptualContainer"); 
      Models.GenerateMetadata(); 
      Models.WriteModelSchema(csdlFilePath); 
      Models.WriteStorageMapping(mslFilePath); 
     } 
    } 

    class Program 
    { 
     private static Generators EntityGenerators { get; set; } 

     [STAThread] 
     static void Main() 
     { 
      try 
      { 
       EntityGenerators = new Generators(); 
       EntityGenerators.CreateSsdlFile(@"\shopping.ssdl.xml"); 
       EntityGenerators.CreateCsdlAndMslFile(@"\shopping.csdl.xml", @"\shopping.msl.xml"); 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine(exception.Message); 
      } 
     } 
    } 
} 
+0

Если я использую 'Code' для создания моего' cs' файл, как я могу передать EDMX для 'Code.GenerateCode'? (Первый параметр) – BendEg

Смежные вопросы