1

SubSonic SimpleRepository で AddMany 関数を使用している場合、どうすればオブジェクトに ID を戻すことができますか? 使用した後でも、すべてのオブジェクトが Id=0 になります。

SimpleRepository repository = new SimpleRepository(ConnectionStringName);
repository.AddMany<T>(insertList);

ソースを見ると、次のことがわかります。

public void AddMany<T>(IEnumerable<T> items) where T : class, new()
{
    if (_options.Contains(SimpleRepositoryOptions.RunMigrations))
    {
        Migrate<T>();
    }

    BatchQuery batch = new BatchQuery(_provider);
    foreach(var item in items)
    {
        batch.QueueForTransaction(item.ToInsertQuery(_provider));
    }

    batch.ExecuteTransaction();
}

ここでそのテーブルに最後に挿入された Id のバッチ選択を行うのはどうですか? それは間違ったIDを返す可能性がありますか? 私はいくつかのコードを書き留めて戻ってきます:)

実際の問題

問題は、別の行 (別のテーブル) に挿入された ID を fk として使用するのが好きなことです。バッチ挿入を使用して 2 つの異なる種類の行を追加し、最後に挿入された ID に fk-column を設定する方法があるかもしれません。他の行。少し複雑ですが、要点はわかると思います。

Insert User 
Insert UserAccount -> Set UserAccount.fk_UserId to latest id inserted in User
Insert User 
Insert UserAccount -> Set UserAccount.fk_UserId to latest id inserted in User

バッチとしてなど..それは可能ですか?これは、10,000 行以上× 2 になる可能性があります。

4

2 に答える 2

1

このようなコードを使用します。これは、オブジェクトのバッチを にキャストしたことを前提としています。Listそれ以外の場合は、使用している変数に単純なものを使用foreachします。

using (var ts = new TransactionScope()) {
    thangs.ForEach((t) => {
        t.Id = (int)Repository.Add<Thang>(t);
    });
    ts.Complete();
}

RepositoryのインスタンスですSimpleRepository

(参照を追加)TransactionScopeからのクラスを使用しています。System.TransactionsDBがサポートしている限り、動作するはずです...

于 2011-03-31T03:21:37.910 に答える
0

わかりましたので、実際の問題を解決しました:

IDataProvider provider = ProviderFactory.GetProvider(connectionStringName);

LogEntry entry1 = CreateEntry("1");
LogEntry entry2 = CreateEntry("2");
LogEntry entry3 = CreateEntry("3");
LogEntry entry4 = CreateEntry("4");

List<LogEntry> items = new List<LogEntry>() { entry1, entry2 };

BatchQuery batch = new BatchQuery();
foreach (var item in items)
{
    QueryCommand cmd = item.ToInsertQuery(provider).GetCommand();
    if (item != items.First())
    {
        cmd.CommandSql = cmd.CommandSql.Replace("@ins_LogEntriesfk_LogEntryId", "@@IDENTITY");
    }
    batch.QueueForTransaction(cmd);
}

batch.ExecuteTransaction();

これは、問題を解決するための好ましい方法ですか。GroupId (Guid) を使用してテーブルに挿入されたすべての ID を格納し、これを抽出するという別のアイデアを思いつきました。接続に挿入されたすべての ID を抽出する簡単な方法が必要ですか?

于 2010-07-21T08:58:17.883 に答える