0

我有一个用于编辑事件的表单,其中用户可以(a)在 FormView 中编辑事件的详细信息(标题、描述、日期等)和(b)查看和编辑联系人的 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>

这可以正常工作,但当然它会在更改数据库时保留它们;并且仅在已创建事件时才有效。理想情况下,我希望仅在 FormView 保存后保留对 ListView 的更改(因此,如果有人对 ListView 进行了一些更改,然后从 FormView 中取消,则更改将被丢弃)。同样,我希望能够一次创建一个新活动,输入其详细信息,并让一些人注册它;当 FormView 保存时,它会获取事件的新 ID,然后 ListView 使用该 ID 保存。

在过去(Linq 之前)我已经用我自己广泛定制的 FormView 和 SqlDataSource 对象完成了这一点,它们负责临时保存数据更改、从 FormView 获取事件 ID 等。有没有更标准的方法使用 LinqDataSource 处理这种情况?

4

2 回答 2

1

因此,您希望将两个 LinqDataSource 包装在一个事务中。有一种偷偷摸摸的方法来利用 LinqDataSource 数据绑定和事件,并且仍然只执行一次提交。使用这种方法,您仍然可以使用动态数据、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!"/>

现在在您后面的代码中使用单个提交按钮来模拟 LinqDataSources 的行为。您使用数据源插入项目,这将创建新对象,抓取对象,为第二个对象再次执行此操作。将这两个项目和您想要的任何其他逻辑链接在一起,然后将其作为单个事务插入到数据库中。关键是在 Inserting 事件中设置 Cancel 标志,这样数据源就不会真正插入到数据库中。

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();
    }
}
于 2009-02-17T04:34:51.417 回答
0

您是否在表之间设置了外键?如果你这样做 - 那么它应该在保存新事件列表时抛出异常。

在主题上,有一种方法可以同时以编程方式创建事件 + 列表记录。

但是您将不得不编写一些代码。

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 系列肯定有这个描述

于 2008-11-09T20:18:23.540 回答