实体框架中的“克隆”EntityConnections和ObjectContexts

时间:2012-09-25 18:32:08

标签: c# .net entity-framework .net-4.5 entity-framework-5

(这曾经是一个由两部分组成的问题,但由于第二部分确实很重要,我决定将其分成两个单独的帖子。第二部分见Using Serialization to copy entities between two ObjectContexts in Entity Framework。< /强>

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

我知道this question alreadyEntityConnectionStringBuilder MDSN documentation示例,但我需要知道是否有一种编程方式来获取值来初始化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???
    }
}

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

  • "System.Data.SqlClient"
  • "res://*/EntityModel.csdl|res://*/EntityModel.ssdl|res://*/EntityModel.msl"
从某个地方

而不使用文字值?

1 个答案:

答案 0 :(得分:1)

元数据

您应该能够使用res://*/告诉Entity Framework在调用程序集中搜索所有.csdl,.ssdl和.msl文件。或者,使用res://assembly full name here/搜索特定程序集。请注意,这两种语法都将加载所有找到的文件,在同一个程序集中有几个.edmx之前可以正常工作,从而生成多个CSDL / SSDL / MSL文件(.edmx文件基本上是这三个文件的串联)。更多信息on MSDN

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

提供商

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

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