在運行時更改模式名稱 - 實體框架

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模型都由此函數修改,而不僅僅是指定的模型。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因