Получить идентификатор при использовании 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 (добавить ссылку). Пока ваша БД поддерживает это, оно должно работать...

Другие вопросы по тегам