Как вставить многовложенный элемент с помощью C#/Dapper?C#

Место общения программистов C#
Ответить
Anonymous
 Как вставить многовложенный элемент с помощью C#/Dapper?

Сообщение Anonymous »

У меня есть серия классов, которые выглядят следующим образом:

Код: Выделить всё

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
}
(Представьте себе такой сценарий, как «Регистрация гения»: у меня есть список под названием «Классная вечеринка». В этом списке есть «Тарелки», «Вилки» и «Салфетки». Тогда на каждого смогут подписаться 4 человека).
Теперь, когда моя конечная точка API, использующая SignUpList, активирована, я рад использовать некоторые UDT в качестве параметров и объединить все мои записи в существующие таблицы.
У меня возникла проблема с логикой вставки записи в первый раз, когда у меня еще нет ItemPersonId в ItemPerson.
Например:
Я могу сохранить свой SignUpList и получить обратно SignUpListId используя что-то подобное с Dapper:

Код: Выделить всё

    var listId = ExecuteScalar("dbo.SaveList", parameters, commandType: StoredProcedure)
И затем я могу заполнить это в UDT для вставки SignUpLists (или даже вставить их в один и тот же запрос). Моя проблема возникает на следующем уровне вложенности:
Как мне получить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»