Linq2Sql将记录插入相关表

时间:2009-05-17 22:30:51

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

类似情况:How to add several dependent records with LINQ2SQL (这似乎合乎逻辑,但对我来说不起作用)

ASP.NET MVC + Linq2SQL

我有2个名为Challenges and Participants的表。

  • 挑战{challengeId, ChallengeDesc,applicantId, respondantId}
  • 参与者{participantId,FirstName,LastName}

参与者与挑战之间存在一对多关系 - 每个关键字为1(applicantId,RespondantId)。

我有一个输入表单,收集所有字段以创建新的申请人和响应者以及挑战。 Databinder将所有字段绑定到Challenge及其子参与者,但是,当浏览Linq2Sql创建的结构时,参与者对象的名称与挑战对象中的键名称不匹配(applicantId与Participant对象匹配,respondantId与Participant1匹配)对象)。

因此,当我在InsertOnSubmit(aChallenge)之后尝试SubmitChanges()时,我从Linq2Sql返回一个foreign_key约束验证消息。在SQL Server Profiler中,我可以看到正在正确创建参与者,但是当保存质询时,这些新插入的参与者的ID未被设置为质询对象,因此系统正在抛出外键违规消息。

我如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你必须以我认为的方式编写它(假设你有参与者和挑战课程):

Participant applicant = new Participant();
Participant respondant = new Participant();
//update your participants here

Challenge insertedChallenge = new Challenge();
//update your challenge values here

applicant.Challenges.add(insertedChallenge);
respondant.Challenges1.add(insertedChallenge);

submitChanges();

Linq-to-SQL应自动分配这些属性(挑战和挑战),以便为您设置键值。

希望它有所帮助。

答案 1 :(得分:0)

您可能希望编辑数据对象(通常使用DBML设计器),并分别将Participant - 类型的属性重命名为ApplicantRespondent。使用ParticipantParticipant1比使用它更容易。您可以在关联属性(连接表的行)中执行此操作。

如果要在Challenge中分配外键,则有两种选择。如果您自己拥有Participant个对象,则可以将它们分配给(新重命名的)ApplicantRespondent属性(并且LINQ to SQL将更新ApplicantID或{{1因此)。或者,如果您拥有RespondentID,则可以直接将其分配到ParticipantIDApplicantID