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

How to generate CSDL and MSL files programmatically?

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

我已经了解了如何在 C# 中以编程方式创建 SSDL 文件。我正在使用 EntityStoreSchemaGenerator class,它是这样写数据的:

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

我可以给你看我得到的示例 SSDL 文件:http://pastebin.com/3U4A6fY9

没关系,但是如何获取 CSDL 和 MSL 文件?

据我了解,需要使用 EntityModelSchemaGenerator class 从 System.Data.Entity.Design 命名空间生成 CSDL 和 MSL 文件以达到此目的。

如果要看https://msdn.microsoft.com/en-us/library/system.data.entity.design.entitymodelschemagenerator_methods(v=vs.110).aspx

有两种方法:

可用于生成所需文件 (CSDL && MSL)。 但我很困惑......如何生成它们,如果 EntityModelSchemaGenerator 构造函数需要 System.Data.Metadata.Edm.EntityContainer.

据我了解,我必须使用 EntityConnection class.

准备一些实体容器

但是,如果我的目标是创建 *.csdl 和 *.以前的 msl 文件?

所以在创建所有元数据文件之前我不能使用 EntityModelSchemaGenerator?那么创建*.csdl和*.msl文件的方法是什么(*.ssdl文件就搞定了)?

我已经使用

解决了我的问题

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