作为我们应用程序的一项功能,我希望找到将数据库中的相关数据子集从SQL-Server 2008 Express数据库导出到磁盘的最佳方法。导出的内容需要导入,将身份保存到数据库和服务器等其他内容中。
我有一个143个表的中型数据模型,我在其中使用Entity Framework 3.5在我们的应用程序中进行数据访问。从模型中我想根据给定的标准从几乎所有表中提取行。
C#和实体框架的新手,但不是SQL-Server的新手,我从另一个开发人员手中接管了这个项目,开发人员为每个要提取的实体编写ToXML()方法(完成20%)。显然是维护噩梦。更糟糕的是FromXML()到实体,其中复杂性与唯一键等有关......
我尝试使用SELECT ... FOR XML AUTO,XMLSCHEMA结合Microsoft SQLXML批量加载。虽然起初它与普通的香草表很好,但我很快就陷入了死胡同,因为它似乎不支持没有模式的XML数据类型,或者至少没有大量的人工干预。我们有几个包含XML数据类型列的表。此外,还有一些未知的复杂性,即大量加载通常与触发器,空值,唯一键和约束有关,还有我认为还没有遇到的更多。
我的一个想法是为我们的数据库编写匹配的XSD架构(或生成一个),并使用XSD.exe生成一个类模型作为DTO的集合。然后使用AutoMapper之类的映射库来填充DTO并将它们序列化到磁盘。然后在导入时执行相反的操作。
我知道这是一个大而广泛的问题,但任何人都可以提供一些指导或想法吗? 有没有办法可以通过实体框架中的选项来完成? 是否有开源库可以做到这一点?
答案 0 :(得分:0)
我不知道你的对象模型,但是你可能只使用XML序列化吗?
public static string ObjectToXML(object Object)
{
if (Object == null)
throw new ArgumentException("Object can not be null");
using (MemoryStream Stream = new MemoryStream())
{
XmlSerializer Serializer = new XmlSerializer(Object.GetType());
Serializer.Serialize(Stream, Object);
Stream.Flush();
return UTF8Encoding.UTF8.GetString(Stream.GetBuffer(), 0, (int)Stream.Position);
}
}
public static T XMLToObject<T>(string XML)
{
if (string.IsNullOrEmpty(XML))
throw new ArgumentException("XML can not be null/empty");
using (MemoryStream Stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(XML)))
{
XmlSerializer Serializer = new XmlSerializer(typeof(T));
return (T)Serializer.Deserialize(Stream);
}
}
我看到的主要问题是XML数据(可能在序列化之前将其包装在CDATA中)。
答案 1 :(得分:0)
如何使用SQL Server Compact保存导出。然后,您可以使用Microsoft Sync Framework导出/导入所有需要的数据,包括身份。