如何使用元数据加载委托创建 MetadataWorkspace? [英] How can I create a MetadataWorkspace using metadata loading delegates?

查看:25
本文介绍了如何使用元数据加载委托创建 MetadataWorkspace?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遵循了这个示例 在运行时更改架构名称 - 实体框架,我可以从 MetaDataWorkspace 创建一个新的 EntityConnection,然后我用它来构造具有不同架构的 DbContext,但是我收到编译器警告,说 RegisterItemCollection 方法已过时,并且使用接受元数据加载的构造函数构造 MetadataWorkspace代表."

I followed this example Changing schema name on runtime - Entity Framework where I can create a new EntityConnection from a MetaDataWorkspace that I then use to construct a DbContext with a different schema, but I get compiler warnings saying that RegisterItemCollection method is obsolete and to "Construct MetadataWorkspace using constructor that accepts metadata loading delegates."

我该怎么做?这是有效的代码,但为 RegsiterItemCollection 调用提供了 3 个警告.我很惊讶它的工作原理,因为警告说已过时而不仅仅是已弃用.

How do I do that? Here is the code that is working but gives the 3 warnings for the RegsiterItemCollection calls. I'm surprised it works since warning says obsolete not just deprecated.

        public static EntityConnection CreateEntityConnection(string schema, string connString, string model)
    {
        XmlReader[] conceptualReader = new XmlReader[]
        {
            XmlReader.Create(
                Assembly
                    .GetExecutingAssembly()
                    .GetManifestResourceStream(model + ".csdl")
            )
        };

        XmlReader[] mappingReader = new XmlReader[]
        {
            XmlReader.Create(
                Assembly
                    .GetExecutingAssembly()
                    .GetManifestResourceStream(model + ".msl")
            )
        };

        var storageReader = XmlReader.Create(
            Assembly
                .GetExecutingAssembly()
                .GetManifestResourceStream(model + ".ssdl")
        );
        //XNamespace storageNS = "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"; // this would not work!!!
        XNamespace storageNS = "http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

        var storageXml = XElement.Load(storageReader);

        foreach (var entitySet in storageXml.Descendants(storageNS + "EntitySet"))
        {
            var schemaAttribute = entitySet.Attributes("Schema").FirstOrDefault();
            if (schemaAttribute != null)
            {
                schemaAttribute.SetValue(schema);
            }
        }
        storageXml.CreateReader();

        StoreItemCollection storageCollection =
            new StoreItemCollection(
                new XmlReader[] { storageXml.CreateReader() }
            );
        EdmItemCollection conceptualCollection = new EdmItemCollection(conceptualReader);
        StorageMappingItemCollection mappingCollection =
            new StorageMappingItemCollection(
                conceptualCollection, storageCollection, mappingReader
            );

        //var workspace2 = new MetadataWorkspace(conceptualCollection, storageCollection, mappingCollection);
        var workspace = new MetadataWorkspace();
        workspace.RegisterItemCollection(conceptualCollection);
        workspace.RegisterItemCollection(storageCollection);
        workspace.RegisterItemCollection(mappingCollection);

        var connectionData = new EntityConnectionStringBuilder(connString);
        var connection = DbProviderFactories
            .GetFactory(connectionData.Provider)
            .CreateConnection();
        connection.ConnectionString = connectionData.ProviderConnectionString;

        return new EntityConnection(workspace, connection);
    }

推荐答案

我能够摆脱 3 条警告消息.基本上它希望您在 MetadataWorkspace 的构造函数中注册集合.

I was able to get rid of the 3 warning messages. Basically it wants you to register the collections in the constructor of the MetadataWorkspace.

MetadataWorkspace 有 3 种不同的重载,我选择使用需要为工作区元数据提供路径(字符串数组)的重载.为此,我将读者保存到临时文件并重新加载它们.

There are 3 different overloads for MetadataWorkspace, I chose to use the one which requires to to supply a path (array of strings) to the workspace metadata. To do this I saved readers to temp files and reloaded them.

这对我有用,没有任何警告.

This is working for me without any warnings.

public static EntityConnection CreateEntityConnection(string schema, string connString, string model) {

        var conceptualReader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream(model + ".csdl"));
        var mappingReader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream(model + ".msl"));
        var storageReader = XmlReader.Create(Assembly.GetExecutingAssembly().GetManifestResourceStream(model + ".ssdl"));

        XNamespace storageNS = "http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

        var storageXml = XElement.Load(storageReader);
        var conceptualXml = XElement.Load(conceptualReader);
        var mappingXml = XElement.Load(mappingReader);

        foreach (var entitySet in storageXml.Descendants(storageNS + "EntitySet")) {
            var schemaAttribute = entitySet.Attributes("Schema").FirstOrDefault();
            if (schemaAttribute != null) {
                schemaAttribute.SetValue(schema);
            }
        }

        storageXml.Save("temp.ssdl");
        conceptualXml.Save("temp.csdl");
        mappingXml.Save("temp.msl");

        MetadataWorkspace workspace = new MetadataWorkspace(new List<String>(){
                                                                @"temp.csdl",
                                                                @"temp.ssdl",
                                                                @"temp.msl"
                                                        } 
                                                       ,  new List<Assembly>());


        var connectionData = new EntityConnectionStringBuilder(connString);
        var connection = DbProviderFactories.GetFactory(connectionData.Provider).CreateConnection();
        connection.ConnectionString = connectionData.ProviderConnectionString;

        return new EntityConnection(workspace, connection);

    }

这篇关于如何使用元数据加载委托创建 MetadataWorkspace?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆