用于子记录的LinqDataSource / ListView - 仅在保存包含记录时保存?

时间:2008-11-07 17:59:26

标签: asp.net linq-to-sql linqdatasource

我有一个用于编辑事件的表单,用户可以在其中(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处理此场景的标准方法?

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

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

关于主题,有一种方法可以在programmaticaly的同时创建一个事件+列表记录。

但你必须写一些代码。

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