无法使用已在使用的密钥添加实体

时间:2010-09-15 18:26:26

标签: c# .net asp.net linq-to-sql

尝试使用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,但我得到了同样的错误。

2 个答案:

答案 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吗?