如何以编程方式生成CSDL和MSL文件

本文关键字:CSDL MSL 文件 方式生 编程 | 更新日期: 2023-09-27 17:52:13

我正在尝试使用c#语言实现动态ORM模型生成。我需要这个,因为我的工作任务。

我已经实现了如何在c#中以编程方式创建SSDL文件。我使用EntityStoreSchemaGenerator类,它是这样写数据:

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

我可以向您展示我得到的样例wsdl文件:http://pastebin.com/3U4A6fY9

这是好的,但如何获得CSDL和MSL文件?

据我所知,需要使用EntityModelSchemaGenerator类从System.Data.Entity.Design命名空间生成CSDL和MSL文件。

如果要查看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 (mapping specification language)写入指定文件。
  • WriteStorageMapping(XmlWriter)将生成的映射规范语言(MSL)写入XmlWriter对象。

可用于生成所需文件(CSDL &&火星科学实验室)。但是我很困惑……如何生成它们,如果EntityModelSchemaGenerator构造器需要System.Data.Metadata.Edm.EntityContainer

正如我所理解的,我必须使用EntityConnection类准备一些实体容器。

但是,我如何建立实体连接,这需要所有的元数据文件已经创建(*)。csdl, *。ssdl, *。MSL),如果我的目标是创建*。csdl,*。以前的MSL文件?

所以我不能使用EntityModelSchemaGenerator,直到我创建所有元数据文件?那么如何创建*呢?CSDL和*。MSL文件(*。SSDL文件完成了吗?

如何以编程方式生成CSDL和MSL文件

我已经用

解决了我的问题

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