1

当我将 AddMany 函数与 SubSonic SimpleRepository 一起使用时,如何将 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,也许有一种方法可以使用批量插入来添加两种不同类型的行并将 fk-column 设置为最后插入的 id另一排。那里有点复杂,但我想你明白了:

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

等等作为一个批次..这可能吗?这可能是 10k 或更多行乘以 2。

4

2 回答 2

1

我使用这样的代码。这假设您已将一批对象转换为 a List,否则foreach对您正在使用的任何变量使用简单的:

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

Repository是你的实例SimpleRepository

它使用TransactionScope来自System.Transactions(添加参考)的类。只要您的数据库支持它,它应该可以工作......

于 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 回答