当我在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。
答案 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?