0

したがって、毎週更新される 2 つのデータベースと 1 つの SQLite ファイルを取得しました (したがって、この更新を週に 1 回実行する必要があります)。そしてSQLサーバー(ただし、現在はローカルテストなどのためだけにSQLfileを使用しています)。ただし、SQLiteファイルからSQLserverにすべてのデータをコピーする簡単な方法を探しています。10個のクラスがあり、両方のデータベースに存在しますが、sqliteには最初に大文字がなく、sqlserverには大文字がありません。

id、name、lastname を持つ sqlite に person テーブルがあります。SQLserver では、テーブルは Person (大文字) と呼ばれ、列は Id Name と Lastname です。SQlite ファイルはサードパーティから提供されたもので、サードパーティが何をするかはわかりません。SQL サーバーは Code First EF で作成されています。(そして、私はすべてをキャメルケースにすることを好みます)。

すべてのデータをコピーする簡単な方法はありますか?クラスのプロパティ ループを探してから、たとえば下げる方法を探していました。

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 を再度インストールする必要がありました (現在両方を実行しています)。

他に質問がある場合は、お気軽に質問してください。

編集:ナビゲーションプロパティもあることに言及するのを忘れていました。(パーソンアビリティのように)。これもコピーする必要があります

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 に答える