LinqDataSource / ListView для дочерних записей - сохранять только при сохранении содержащейся записи? - PullRequest
0 голосов
/ 07 ноября 2008

У меня есть одна форма для редактирования события, в которой пользователь может (а) редактировать детали события (заголовок, описание, даты и т. Д.) В FormView и (б) просматривать и редактировать ListView из контакты, которые зарегистрированы на событие.

Вот мой LinqDataSource, который позволяет мне добавлять и удалять контакты на событие.

<asp:linqdatasource runat="server" id="ContactsDatasource" contexttypename="Db" tablename="ContactsCalendarEventsXtabs" autogeneratewhereclause="true" enabledelete="true" enableinsert="true">
    <whereparameters>
        <asp:querystringparameter name="CalendarEventID" querystringfield="id" type="Int32" />
    </whereparameters>
    <insertparameters>
        <asp:querystringparameter name="CalendarEventID" querystringfield="id" type="Int32" />
    </insertparameters>
</asp:linqdatasource>

Это прекрасно работает, но, конечно, оно сохраняет изменения в базе данных по мере их внесения; и это работает только тогда, когда событие уже было создано. В идеале я хотел бы, чтобы мои изменения в ListView сохранялись только после сохранения FormView (поэтому, если кто-то вносит некоторые изменения в ListView, а затем отменяет его из FormView, эти изменения отбрасываются). В том же духе я хотел бы иметь возможность создать новое событие, ввести его детали и подписать на него несколько человек, причем сразу; когда FormView сохраняет, он получает новый идентификатор для события, а затем ListView сохраняет с использованием этого идентификатора.

В прошлом (до Linq) я достигал этого с помощью своих собственных сильно настроенных объектов FormView и SqlDataSource, которые заботятся о временном сохранении изменений данных, получении идентификатора события из FormView и т. Д. Есть ли еще Стандартный способ борьбы с этим сценарием с использованием LinqDataSource?

Ответы [ 2 ]

1 голос
/ 17 февраля 2009

Таким образом, вы хотите объединить два LinqDataSources в одну транзакцию. Существует хитрый способ использовать привязку данных LinqDataSource и события, и при этом делать только один коммит. Используя этот метод, вы все равно можете использовать Dynamic Data, FormView, GridView, валидацию и т. Д. Он основан только на подключении к источникам данных.

Пример разметки:

<FormView>...</FormView>
<ListView>...</ListView>
<LinqDataSource ID="dsEvent" ...> </LinqDataSource>
<LinqDataSource ID="dsContact" ...> </LinqDataSource>
<asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit it All!"/>

Теперь в коде позади вы используете единственную кнопку Submit, чтобы имитировать поведение LinqDataSources. Вы используете источник данных для вставки элемента, который создает новый объект, перехватывает объект и делает это снова для второго объекта. Свяжите два элемента вместе и любую другую логику, которую вы хотите, а затем вставьте ее в базу данных как одну транзакцию. Ключ должен установить флаг Отмена в событии Вставка, чтобы источник данных фактически не вставлялся в базу данных.

protected void btnSubmit_Click(object sender, EventArgs e)
{
    Event evt = null;
    Contact contact = null;

    dsEvent.Inserting += (o,ea) => { evt = (ea.NewObject as Event); ea.Cancel = true; };
    dsEvent.InsertItem(true);
    dsContact.Inserting += (o, ea) => { contact = (ea.NewObject as Contact); ea.Cancel = true; };
    dsContact.InsertItem(true);

    evt.Contacts.Add(contact);

    using (var dbContext = new ContactsCalendarEventsXtabs())
    {
        dbContext.Events.InsertOnSubmit(evt);
        dbContext.SubmitChanges();
    }
}
0 голосов
/ 09 ноября 2008

У вас есть внешний ключ, установленный между таблицами? если вы это сделаете, то при сохранении списка для нового события должно появиться исключение.

А по теме есть способ создать событие + список записей одновременно программно.

но вам придется написать код.

create all list items programmaticaly.
create event proggramaticaly.
event myevent = new event();
event.someprop = zzxxx;

link them programmaticaly.
then use  yourdatacontext.events.InsertOnSubmit(event);

и то же самое для элементов списка.

Блог ScottGu. В серии LINQ этот случай описан наверняка

...