Код: Выделить всё
public class SignUpList {
public int? SignUpListId { get; set; }
public IEnumerable Items { get; set; }
}
public class SignUpItem {
public int? SignUpItemId { get; set; }
public int? SignUpListId { get; set; }
public IEnumerable Persons { get; set; }
}
public class ItemPerson {
public int? ItemPersonId { get; set; }
public int? SignUpItemId { get; set; }
public int PersonId { get; set; } //fk reference to another table
}
Теперь, когда моя конечная точка API, использующая SignUpList, активирована, я рад использовать некоторые UDT в качестве параметров и объединить все мои записи в существующие таблицы.
У меня возникла проблема с логикой вставки записи в первый раз, когда у меня еще нет ItemPersonId в ItemPerson.
Например:
Я могу сохранить свой SignUpList и получить обратно SignUpListId используя что-то подобное с Dapper:
Код: Выделить всё
var listId = ExecuteScalar("dbo.SaveList", parameters, commandType: StoredProcedure)
Как мне получить SignUpItemId, чтобы поместить его на моих людей? Я не могу просто засунуть их в UDT, потому что у меня не будет возможности узнать, к какому элементу SignUpItem привязан человек.
Я мог бы сделать кое-что foreach зацикленные махинации -
Код: Выделить всё
foreach (var item in SignUpList.Item) {
var itemId = ExecuteScalar("[dbo].[SaveItem]", parameters); //assume I've created appropriate parameters
//Insert into my DataTable based off the UDT for ItemPerson
}
_ = ExecuteAsync("dbo.SavePersons", params) //(params being UDT table populated in the foreach above)
Другой вариант, который я рассмотрел, — это массовая вставка ВСЕХ элементов SignUpItems
code> за один раз, но как мне привязать эти идентификаторы к существующему списку? (Я не думаю, что смогу создать новый список SignUpItem на основе возврата, потому что к элементам не будет привязан Person, в этом вся проблема).
Я также рассматривал возможность использования «номера строки» и использования его в качестве псевдоидентификатора для их связи. Для этого потребуется добавить новое поле к родительскому элементу, но это может быть подходящим решением, если я пытаюсь свести к минимуму соединения с базой данных?
Есть ли что-то действительно простое, чего мне не хватает в Dapper? можно ли справиться с этим более эффективно?
К сожалению, требовать сохранения списка и элементов отдельно нецелесообразно из-за особенностей приложения, в противном случае это был бы мой предпочтительный подход.
К сожалению, требовать сохранения списка и элементов отдельно нецелесообразно.
p>
Если другая структура данных была бы лучше, я тоже готов ее рассмотреть, но мне трудно представить, как заставить эту логику работать без тройного вложения. Я также рассматривал возможность использования ItemPerson в качестве сериализованного поля JSON в SignUpItem, но мне также нужно иметь возможность запрашивать его.
Подробнее здесь: https://stackoverflow.com/questions/791 ... g-c-dapper
Мобильная версия