LINQ to SQL插入多个表问题

时间:2010-05-13 17:01:43

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

我有 3个表。一个主要 EmploymentPlan表,其中 PK GUID EmploymentPlanID 2 FK GUID PrevocServicesID& GUID JobDevelopmentServicesID。当然还有其他领域,几乎只有varchar()。然后是2个辅助表,其中相应的PK为主要的FK。

我正在尝试编写LINQ INSERT方法,并且正在努力创建密钥。说我有一个像下面这样的方法。那是对的吗?这甚至会起作用吗?我应该为每个人分别采用单独的方法吗?

此外,当插入时,我认为我不需要为表提供PK。它是自动生成,没有?

感谢。

public static void InsertEmploymentPlan(int planID, Guid employmentQuestionnaireID, string user, bool communityJob, bool jobDevelopmentServices, bool prevocServices, bool transitionedPrevocIntegrated, bool empServiceMatchPref)
{
    using (var context = MatrixDataContext.Create())
    {
          var empPrevocID = Guid.NewGuid();
          var prevocPlan = new tblEmploymentPrevocService
          {
              EmploymentPrevocID = empPrevocID
          };
          context.tblEmploymentPrevocServices.InsertOnSubmit(prevocPlan);

          var empJobDevID = Guid.NewGuid();
          var jobDevPlan = new tblEmploymentJobDevelopmetService()
          {
              JobDevelopmentServicesID = empJobDevID
          };
          context.tblEmploymentJobDevelopmetServices.InsertOnSubmit(jobDevPlan);

          var empPlan = new tblEmploymentQuestionnaire
          {
              CommunityJob = communityJob,
              EmploymentQuestionnaireID = Guid.NewGuid(),
              InsertDate = DateTime.Now,
              InsertUser = user,
              JobDevelopmentServices = jobDevelopmentServices,
              JobDevelopmentServicesID =empJobDevID,
              PrevocServices = prevocServices,
              PrevocServicesID =empPrevocID,
              TransitionedPrevocToIntegrated =transitionedPrevocIntegrated,
              EmploymentServiceMatchPref = empServiceMatchPref 
          };
          context.tblEmploymentQuestionnaires.InsertOnSubmit(empPlan);

          context.SubmitChanges();
    }
}

我知道我可以使用多于1个InsertOnSubmit(),请参阅this question,我只是不明白这将如何适用于我的情况和PK / FK创建。

2 个答案:

答案 0 :(得分:3)

当db中的表定义为您执行时,可以自动生成pk。此外,linq模型上相应pk的属性必须配置为在插入后更新,因此它获取自动生成的ID。

我认为这些表格上的关系不在你的linq模型上。否则你应该能够做到:

    using (var context = MatrixDataContext.Create())
    {
            var empPlan = new tblEmploymentQuestionnaire
                              {
                                  CommunityJob = communityJob,
                                  InsertDate = DateTime.Now,
                                  InsertUser = user,
                                  JobDevelopmentServices = jobDevelopmentServices,
                                  JobDevelopmentService = new tblEmploymentJobDevelopmetService(),
                                  PrevocServices = prevocServices,
                                  PrevocService = new tblEmploymentPrevocService(),
                                  PrevocServicesID =empPrevocID,
                                  TransitionedPrevocToIntegrated =transitionedPrevocIntegrated,
                                  EmploymentServiceMatchPref = empServiceMatchPref 
                              };
            context.tblEmploymentQuestionnaires.InsertOnSubmit(empPlan);

            context.SubmitChanges();
    }

PS。没有模型中的关系是一个设计决策,所以上述并不意味着这是唯一的方法。你展示的方式(在另一个答案中使用额外的SubmitChanges调用)是完全有效的,只是响应不同的设计。

答案 1 :(得分:1)

我认为问题是(如果我理解正确的话)你推迟插入,除非你不知道...

由于您正在创建FK但直到最后它们的插入不同,因此它不知道该怎么做,因此当您尝试创建主条目时,它会强制执行FK约束(可能尚不存在),从而失败。尝试创建FK条目并在插入主条目之前实际将更改提交到数据库。

例如,假设您有以下表格: 儿童 玩具 ToyOwner

ToyOwner对Child和Toy有FK限制。如果该表中缺少条目,您将无法在ToyOwner中插入条目。所以你必须做以下事情:

    Child myChild;
    Toy myToy;

//Queue up the changes that are going to be submitted
    InsertOnSubmit(myChild)
    InsertOnSubmit(myToy)

//Submit the queue
    SubmitChanges();

//Now that those FKs are filled, we can insert the main entry with those FK values
    ToyOwner = new myToyOwner
    myToyOwner.Child = myChild
    myToyOwner.Toy = myToy

//And insert the new queue into the DB
    InsertOnSubmit(myToyOwner)
    SubmitChanges();