我有 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创建。
答案 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();