使用其他属性名称从另一个DB导入数据

时间:2012-09-10 13:52:30

标签: c# database entity-framework

所以我有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一样)。还需要复制

1 个答案:

答案 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

顺便说一句,最简单的方法是创建手写映射。