(这以前是一个分为两部分的问题,但由于第二部分实际上是重要的一部分,我决定把它分成两个单独的帖子。第二部分见Using Serialization to copy entities between two ObjectContexts in Entity Framework。
我想为我的实体模型创建一个相当通用的“cloner”数据库。另外,我可能需要支持不同的提供者等等。我在用api。
我知道this question already和EntityConnectionStringBuilder MDSN documentation示例,但我需要知道是否有编程方法来获取初始化ObjectContext
的Provider
和Metadata
属性的值?
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???
}
}
也就是说,有没有办法把
EntityConnectionStringBuilder
"System.Data.SqlClient"
从某个地方而不是使用文字值?
最佳答案
元数据
您应该能够使用res://*/
告诉实体框架在调用程序集中搜索所有.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;
}