Вернуть идентификатор при использовании SubSonic SimpleRepository AddMany

Как я могу вернуть идентификатор объекту, когда я использую функцию 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 тыс. Строк, умноженных на 2.


person Andreas    schedule 20.07.2010    source источник


Ответы (2)


Я использую такой код. Предполагается, что вы привели свой пакет объектов в List, в противном случае используйте простой foreach для любой переменной, которую вы используете:

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

Repository - это экземпляр вашего SimpleRepository.

Он использует класс TransactionScope из System.Transactions (добавить ссылку ). Пока ваша БД поддерживает это, она должна работать ...

person kamranicus    schedule 31.03.2011
comment
Можно ли этого добиться с помощью ActiveRecord? - person Marc M; 24.08.2011

Итак, я решил актуальную проблему:

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

person Andreas    schedule 21.07.2010