使用SubSonic SimpleRepository AddMany时获取ID

时间:2010-07-20 19:10:07

标签: subsonic batch-file insert simplerepository subsonic-simplerepository

当我在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,也许有一种方法可以使用批量插入来添加两种不同的行并将fk列设置为最后一行插入另一行的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。

2 个答案:

答案 0 :(得分:1)

我使用这样的代码。这假设您已将您的一批对象投射到List,否则对您正在使用的任何变量使用简单的foreach

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

Repository是您SimpleRepository的实例。

它正在使用System.Transactions中的TransactionScope类(添加引用)。只要您的数据库支持它,它应该可以工作......

答案 1 :(得分: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?