0

编辑

好吧,我在代码方面所做的一切都是正确的,我把关系放在表格上是错误的!

问题

从任务到消息,我有一对一的关系。插入新项目时,我遇到外键违规。

细节:

数据库结构

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,所以它无法执行此操作,因此这当然会导致外键违规。

我在哪里错了?

4

2 回答 2

2

我能看到的问题是第一个InsertOnSubmit。如果您想将其添加到相关表中,那么我认为您不需要第一个InsertOnSubmit。因为当您插入主对象时,子对象也将使用它的外键插入。

我认为你可以这样做:

var objTask = new Data.Task()
    {
        Message = new Data.Message()
                {
                    Body = "",
                    Subject = ""
                }
    };
    Context.Tasks.InsertOnSubmit(objTask);
    Context.SubmitChanges();
于 2013-02-28T13:20:46.707 回答
0

尝试这样做:

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();

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

于 2013-02-28T13:18:38.257 回答