在运行时更改模式名称 - 实体框架

entity-framework runtime schema

我需要在运行时更改实体的存储架构。我已经关注了一篇很棒的帖子,可以在这里找到: http//blogs.microsoft.co.il/blogs/idof/archive/2008/08/22/change-entity-framework-storage-db-schema-in-runtime的.aspx?CommentPosted =真#commentmessage

这非常有效,但仅适用于查询,不适用于修改。

知道为什么吗?

一般承认的答案

我设法通过使用位于CodePlex(由Brandon Haynes提供)的名为“实体框架运行时模型适配器”的精彩库来解决此问题,可在此处获取: http//efmodeladapter.codeplex.com/

我已经调整了一下,以满足我们的需求,而根本不需要更换设计器代码。

所以,我很好。

无论如何,谢谢,特别是布兰登,这是一项了不起的工作!


热门答案

好吧,我在互联网上寻找这段代码。最后我必须自己做。它基于Brandon Haynes适配器,但是此功能是您在运行时更改模式所需的全部功能 - 您无需替换自动生成的上下文构造函数。

public static EntityConnection Create(
    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";

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

在实例化上下文时,应将生成的EntityConnection作为参数传递。您可以修改它,因此所有ssdl模型都由此函数修改,而不仅仅是指定的模型。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因