如何在 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 中插入具有一对一关系的子对象的主要内容,如果未能解决你的问题,请参考以下文章

双向多对一关联。插入新子项时,还会插入一个新的不需要的父项,并与子项具有相同的名称

如何轻松地重新排序 LINQ to SQL 设计器中的列?

如何在插入之前加快重复检查?

如何使用存储过程在 LINQ to SQL 中使用事务?

Linq to Entities - 使用 Include() 急切加载

使用 linq-to-sql 进行批量插入