0

所以我有 2 个数据库,1 个 SQLite 文件,每周更新一次(所以我需要每周运行一次此更新)。还有一个 SQLserver(但现在只使用 SQLfile 进行本地测试等)。但是我正在寻找一种简单的方法将所有数据从 SQLite 文件复制到 SQLserver,那里有 10 个类,它们存在于两个数据库中,除了 sqlite 在开始时没有大写字母,而 sqlserver 有。

sqlite 中有一个人表,其中包含 id、name 和 lastname。在 SQLserver 上,该表称为 Person(大写),列是 Id Name 和 Lastname。SQlite 文件由第 3 方提供,我无法决定他们做什么。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)。其中也需要复制

4

1 回答 1

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

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

于 2012-09-10T14:11:52.453 回答