所以我有2个数据库,1个SQLite文件,每周更新一次(所以我需要每周运行一次这个更新)。还有一个SQLserver(但现在只使用SQLfile进行本地测试等)。但是我正在寻找一种简单的方法将所有数据从SQLite文件复制到SQLserver,就像10个类一样,它们存在于两个数据库中,除了sqlite在sqlserver启动时没有大写字母。
sqlite中有一个带有id,name和lastname的person表。在SQLserver上,该表称为Person(带有大写),列是Id Name和Lastname。 SQlite文件由第三方提供,我无法决定他们做什么。 SQLserver由Code First EF制作。 (我最喜欢CamelCase)。
有没有一种简单的方法来复制所有数据,我正在寻找类的属性循环,然后降低例如。
ForEach(var person in SQLiteDB.persons)
{
Person thenewperson = new Person();
foreach (var prop in person.GetType().GetProperties())
{
// Here I get stuck I want something like
if(thenewperson.Haspropertie.ToLower(prop.GetName.ToLower) // This is incorrect but I think you ll understand if we do a ToLower then we can get it to work. Since only capitals are the things that are different.
{
//Then we copy the data to "thenewperson"
}
}
SQlserverDB.Persons.AddorUpdate(thenewperson) // Not totaly correct but you get the point.
}
我不确定或者我是否正确的方向,我已经搜索了如何循环属性,但没有找到一个复制数据的好方法的运气。尝试修复VS 2012以使用SQLite,我也很头疼,但是ADO.net似乎没有用,所以我不得不再次安装VS2010等等(现在都运行)。
希望有人有一个很好的解决方案,如果你有任何问题随时可以问。
编辑:我忘了提它还有一个导航属性。 (与PersonAbilitys一样)。还需要复制答案 0 :(得分:1)
这应该做你正在尝试的(未经测试,可能失败):
foreach(var person in SQLiteDB.persons)
{
Person thenewperson = new Person();
foreach (var prop in person.GetType().GetProperties())
{
var newPersonProp = thenewperson.GetType().GetProperties()
.FirstOrDefault(p => p.Name.ToLower() == prop.Name.ToLower());
if (newPersonProp != null)
{
newPersonProp.SetValue(thenewperson, prop.GetValue(person, null), null);
}
}
SQlserverDB.Persons.AddorUpdate(thenewperson); // Not totaly correct but you get the point.
}
但是,您可以通过预先计算属性映射来改进它,因此您不必为每个SQLiteDB.persons查找它。
var propertyMapping = new Dictionary<PropertyInfo, PropertyInfo>();
var efPersonType = typeof(Person);
var sqlitePersonType = typeof(SQLLitePerson);
foreach (var prop in sqlitePersonType.GetProperties())
{
var efProp = efPersonType.GetProperties()
.FirstOrDefault(p => p.Name.ToLower() == prop.Name.ToLower());
if (efProp != null)
{
propertyMapping.Add(prop, efProp);
}
}
foreach (var person in SQLiteDB.persons)
{
Person thenewperson = new Person();
foreach (var i in propertyMapping)
{
i.Value.SetValue(thenewperson, i.Key.GetValue(person, null), null);
}
SQlserverDB.Persons.AddorUpdate(thenewperson);
}
您还可以选择对象映射器,例如AutoMapper。然后,您可以创建自定义约定以使其工作。
如果您有更复杂的实体,那么您应该使用AutoMapper而不是滚动自己的地图解决方案以节省时间:AutoMapper Wiki
顺便说一句,最简单的方法是创建手写映射。