如何在Linq-to-SQL中插入具有一对一关系的子对象
本文关键字:关系 一对一 对象 Linq-to-SQL 插入 | 更新日期: 2023-09-27 18:01:38
编辑
好吧,我在代码方面所做的一切都是正确的,我把关系放错了!
问题
从任务到消息,我有一种一对一的关系。插入新项目时,我遇到了外键冲突。
详细信息:
DB结构
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设置的"自动生成值"设置为true
,"自动同步"设置为"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,所以这当然会导致外键冲突。
这件事我哪里错了?
我看到的问题是第一个InsertOnSubmit
。如果你想把它添加到相关的表中,那么我认为你不需要第一个InsertOnSubmit
。因为当您插入主对象时,子对象也将使用它的外键插入。
我想你可以这样做:
var objTask = new Data.Task()
{
Message = new Data.Message()
{
Body = "",
Subject = ""
}
};
Context.Tasks.InsertOnSubmit(objTask);
Context.SubmitChanges();
尝试这样做:
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();
在使用新记录之前必须提交更改