如何在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,所以这当然会导致外键冲突。

这件事我哪里错了?

如何在Linq-to-SQL中插入具有一对一关系的子对象

我看到的问题是第一个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();

在使用新记录之前必须提交更改