Получить идентификатор при использовании SubSonic SimpleRepository AddMany
Как я могу получить Id обратно к объекту, когда я использую функцию AddMany с SubSonic SimpleRepository. Все мои объекты по-прежнему получают 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();
}
Как насчет выбора партии для последнего вставленного идентификатора в этой таблице? Может ли это когда-нибудь вернуть неправильный идентификатор? Я напишу код и вернусь:)
Актуальная проблема
Проблема в том, что мне нравится использовать вставленные идентификаторы в другой строке (другой таблице) в качестве fk, возможно, есть способ использовать пакетную вставку для добавления двух разных типов строк и установки для столбца fk последнего вставленного идентификатора другой ряд. Там немного сложно, но я думаю, вы поняли:
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.
2 ответа
Итак, я решил актуальную проблему:
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), а затем извлечь это. Должен ли быть более простой способ извлечь все вставленные идентификаторы в соединение?
Я использую такой код Это предполагает, что вы бросили свою группу объектов в List
в противном случае используйте простое foreach
на любую переменную, которую вы используете:
using (var ts = new TransactionScope()) {
thangs.ForEach((t) => {
t.Id = (int)Repository.Add<Thang>(t);
});
ts.Complete();
}
Repository
это пример вашего SimpleRepository
,
Это использует TransactionScope
класс от System.Transactions
(добавить ссылку). Пока ваша БД поддерживает это, оно должно работать...