如何在 Linq to SQL 中插入具有一对一关系的子对象
Posted
技术标签:
【中文标题】如何在 Linq to SQL 中插入具有一对一关系的子对象【英文标题】:How to insert child object with one to one relationship in Linq to SQL 【发布时间】:2013-02-28 13:15:45 【问题描述】:编辑
好吧,我在代码方面所做的一切都是正确的,我把关系放在表格上是错误的!
问题
我从任务到消息是一对一的关系。插入新项目时,我遇到外键违规。
详情:
数据库结构
Task
ID (Primary Key, Guid, Default = NEWID())
MessageID (Unique Index with foreign key pointing to Message.ID)
Message
ID (Primary Key, Guid, Default = NEWID())
每个表的主键的 dbml 设置都将 Auto Generate Value 设置为 true
,Auto-Sync 设置为 OnInsert
我有以下代码来插入新对象
var objMessage = new Data.Message()
Body = "",
Subject = ""
;
Context.Messages.InsertOnSubmit(objMessage);
var objTask = new Data.Task()
Message = objMessage
;
Context.Tasks.InsertOnSubmit(objTask);
Context.SubmitChanges();
这会引发 SQL 错误外键约束被违反。
SQL 分析显示 linq to sql 正在将任务插入到消息之前,这是它无法执行的操作,因为它需要消息中的 id,所以这当然会导致外键冲突。
我哪里错了?
【问题讨论】:
【参考方案1】:我看到的问题是第一个InsertOnSubmit
。如果您想将其添加到相关表中,那么我认为您不需要第一个 InsertOnSubmit
。因为当你插入主对象时,子对象也将插入它的外键。
我认为你可以这样做:
var objTask = new Data.Task()
Message = new Data.Message()
Body = "",
Subject = ""
;
Context.Tasks.InsertOnSubmit(objTask);
Context.SubmitChanges();
【讨论】:
是的,这是我最初的做法,他们按照我的预期工作。我将您的问题标记为正确:) 我的问题是编辑中的数据库,就像我的编辑说我把关系错误地放在了一样。【参考方案2】:尝试这样做:
var objMessage = new Data.Message()
Body = "",
Subject = ""
;
Context.Messages.InsertOnSubmit(objMessage);
Context.SubmitChanges();
var objTask = new Data.Task()
Message = objMessage
;
Context.Tasks.InsertOnSubmit(objTask);
Context.SubmitChanges();
您必须在使用新记录之前提交更改
【讨论】:
以上是关于如何在 Linq to SQL 中插入具有一对一关系的子对象的主要内容,如果未能解决你的问题,请参考以下文章
双向多对一关联。插入新子项时,还会插入一个新的不需要的父项,并与子项具有相同的名称