Получить идентификатор при использовании SubSonic SimpleRepository AddMany - PullRequest
1 голос
/ 20 июля 2010

Как я могу получить 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 ]

1 голос
/ 31 марта 2011

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

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

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

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

0 голосов
/ 21 июля 2010

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

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

...