尝试使用LINQ to SQL向数据库添加对象时遇到了一些麻烦。
我的数据库中有三个表:
--------------------------------------------
tblShows
--------------------------------------------
ShowID | Name
--------------------------------------------
--------------------------------------------
tblShowEvents
--------------------------------------------
ShowEventID | ShowID | Name
--------------------------------------------
--------------------------------------------
tblShowEventAttendees
--------------------------------------------
ShowEventAttendeeID | ShowEventID | Name
--------------------------------------------
Show有很多活动,每个活动都有很多参加者。
我有一个页面,我正在创建一个Show。在页面上,我将事件添加到Show,每个事件的参加者,然后一次保存节目。
这是我的代码:
Show show = new Show();
show.Name = txtName.Text.Trim();
//add ShowEvents to Show
//showEventsList is a variable containing a List of ShowEvents
foreach (ShowEvent ev in showEventsList)
{
show.ShowEvents.Add(new ShowEvent
{
ShowID = show.ShowID,
Name = ev.Name
});
}
//Add ShowEventAttendees to each ShowEvent
//attendeesList is a variable containing a List of ShowEventAttendees
foreach (ShowEvent ev in show.ShowEvents)
{
foreach (ShowEventAttendee attendee in attendeesList)
{
ev.ShowEventAttendees.Add(new ShowEventAttendee
{
ShowEventID = ev.ShowEventID,
Name = attendee.Name
});
}
}
AppDataContext.DataContext.Shows.InsertOnSubmit(show);
AppDataContext.DataContext.SubmitChanges();
问题发生在第二个foreach循环中。如果我把它拿出来,Show和ShowEvents会正确地添加到数据库中。
这里有什么问题?
为Jay编辑:
我现在尝试过这个:
AppDataContext.DataContext.Shows.InsertOnSubmit(show);
AppDataContext.DataContext.SubmitChanges();
//Add ShowEventAttendees to each ShowEvent
//attendeesList is a variable containing a List of ShowEventAttendees
foreach (ShowEvent ev in show.ShowEvents)
{
foreach (ShowEventAttendee attendee in attendeesList)
{
ev.ShowEventAttendees.Add(new ShowEventAttendee
{
ShowEventID = ev.ShowEventID,
Name = attendee.Name
});
}
}
AppDataContext.DataContext.SubmitChanges(); //trying to update, error here
但是我在最后一行得到了同样的错误。通过调试器,ShowEventID不再是0,但我得到了同样的错误。
答案 0 :(得分:1)
这更像是数据库设计问题。您应该让数据库处理数据条目ID分配。
如果您正在运行Sql Server,请转到表设计视图,右键单击ID列并将其作为主键。 现在看一下列属性。将Identity Specification设置为yes。您可以将ID种子和增量设置为您想要的任何内容。
现在,当您运行更新时,请不要更新ID列,只更新其他数据字段。让数据库担心ID分配。
当您输入ShowEvent时,让您的Sql方法使用“SELECT @@ IDENTITY;”返回标量值表示新输入的ShowEvent的ID。现在,您可以使用此ID值输入您的参加者,并将其与您的ShowEvent ID相匹配。确保执行我为EventAttendees表提到的相同主键设置。这样,您确定所有与会者ID在与ShowEvent ID匹配时都是唯一的。同样,您不必明确输入参加者ID。您只需输入ShowEvent的外键值并将其与参加者数据匹配。
不确定这是否清楚,但如果你需要我,我会尝试提出一些代码。
-Matt
答案 1 :(得分:1)
当您致电ShowEventID = ev.ShowEventID
时,它始终为0
,因为尚未分配任何ID。
由于您可能使用标识字段作为主键标识符,因此您必须保存该节目(使用其ShowEvents),以便将ID分配给这些ShowEvents上的ID。
之后,第二个循环将起作用。
或者,如果存储对ShowEvent
中实际ShowEventAttendee
对象的引用(LINQ-to-SQL中的关联)而不是使用整数标识符,则可以调用{{1}你可以一次保存所有内容。
有些东西没了。每次循环时,您都会将与会者添加到同一个ShowEvent = ev
,即名为ShowEvent
的本地变量。我假设这里的目的是为showEvent
的{{1}}中的每一个添加与会者,所以ShowEvents
应该替换为show
吗?