gpt4 book ai didi

entity-framework - 在运行时更改架构名称-Entity Framework

转载 作者:行者123 更新时间:2023-12-03 11:35:26 25 4
gpt4 key购买 nike

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

这完美地工作,但仅适用于查询,不适用于修改。

知道为什么吗?

最佳答案

好吧,我一直在寻找整个Internet上的这段代码。最后,我必须自己做。它基于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模型都可以通过此函数进行修改,而不仅仅是指定的模型。

关于entity-framework - 在运行时更改架构名称-Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2663164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com