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