实体框架中的"克隆"EntityConnections和ObjectContexts

Fer*_*osa 5 .net c# entity-framework .net-4.5 entity-framework-5

(这曾经是一个由两部分组成的问题,但由于第二部分确实是重要的部分,我决定将其拆分为两个单独的帖子.请参阅使用序列化在第二部分的实体框架中的两个ObjectContexts之间复制实体.

我想为我的实体模型创建一个相当通用的"克隆"数据库.此外,我可能需要支持不同的提供商等.我正在使用ObjectContextAPI.

我已经知道这个问题EntityConnectionStringBuilder MDSN文档示例,但是我需要知道是否有一种编程方式来获取值以初始化ProviderMetadata属性EntityConnectionStringBuilder

using (var sourceContext = new EntityContext()) {
    var sourceConnection = (EntityConnection) sourceContext.Connection;
    var targetConnectionBuilder = new EntityConnectionStringBuilder();

    targetConnectionBuilder.ProviderConnectionString = GetTargetConnectionString();
    targetConnectionBuilder.Provider = "System.Data.SqlClient"; // want code
    targetConnectionBuilder.Metadata = "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"; // want code

    using (var targetContext = new EntityContext(targetConnectionBuilder.ConnectionString)) {
        if (!targetContext.DatabaseExists())
            targetContext.CreateDatabase();

        // how to copy all data from the source DB to the target DB???
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,有没有办法获取

  • "System.Data.SqlClient"
  • "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"

从某个地方而不是使用字面值?

Jul*_*ain 1

元数据

您应该能够res://*/告诉实体框架在调用程序集中搜索所有 .csdl、.ssdl 和 .msl 文件。或者,使用res://assembly full name here/在特定程序集中进行搜索。请注意,这两种语法都会加载所有找到的文件,直到同一程序集中有多个 .edmx 为止,它都可以正常工作,从而产生多个 CSDL/SSDL/MSL 文件(.edmx 文件基本上是这三个文件的串联)。有关 MSDN 的更多信息。

如果需要更多控制,请使用Assembly.GetManifestResourceNames列出给定程序集中的所有资源,并手动将 .csdl/.ssdl/.msl 资源匹配在一起,然后根据这些资源名称手动构建元数据字符串。

提供者

提供程序可以在根节点的 Provider 属性中的 SSDL 文件中找到。获得正确的文件名后,使用GetManifestResourceStreamXML 格式的文件并读取该文件。代码应该如下所示:

using (var stream = assembly.GetManifestResourceStream("EntityModel.ssdl")) {
  XDocument document = XDocument.Load(stream);
  string provider = document.Root.Attribute("Provider").Value;
}
Run Code Online (Sandbox Code Playgroud)