EF6代码优先插入外键约束失败

时间:2019-07-19 12:07:50

标签: c# entity-framework-6

在数据库中插入记录时,我遇到了使用EF6的怪异错误。

我在“发票”表中有一些记录,后来我想在表Lsvs中添加一些记录。

我的对象Lsv必须具有发票,但是发票不一定具有Lsv

这是我编写的代码(仅部分类):

public class Lsv
{
    public Guid InvoiceId { get; set; }
    public virtual Invoice Invoice { get; set; }
}

public class Invoice
{
    public virtual Lsv Lsv { get; set; }
}

在创建Lsv时:

var invoice = Domain.Query<Invoice>().FirstOrDefault(x => x.Id == invoiceId);

if (invoice == null)
{
    throw new EntityNotFoundException();
}

// Create the Lsv
var lsv = new Lsv
{
    Amount = invoice.TotalDue.Incl,
    BvrReference = invoice.BankIdentifier,
    InvoiceDueDate = invoice.DueDate,
    DebitorOrganizationNodeId = invoice.DebitorOrganizationNodeId,
    InvoiceId = invoice.Id,
    ContactId = invoice.ContactId,
    OrganizationNodeId = invoice.OrganizationNodeId
};

我100%确定发票已存在于数据库中(调试时,我得到ID来查询找到发票的数据库)。

然后在提交更改时出现异常

  

INSERT语句与FOREIGN KEY约束“ FK_dbo.Lsvs_dbo.Invoices_Id”冲突。在数据库“ Echino-Dev_StephM”的表“ dbo.Invoices”的“ Id”列中发生了冲突。

但是如果我这样做

var lsv = new Lsv
            {
                Amount = invoice.TotalDue.Incl,
                BvrReference = invoice.BankIdentifier,
                InvoiceDueDate = invoice.DueDate,
                DebitorOrganizationNodeId = invoice.DebitorOrganizationNodeId,
                InvoiceId = invoice.Id,
                Invoice = invoice,
                ContactId = invoice.ContactId,
                OrganizationNodeId = invoice.OrganizationNodeId
            };

请注意,我设置了InvoiceId和Invoice-然后它起作用了,我可以将数据插入数据库了。

有人知道为什么在插入InvoiceId对象时仅设置Lsv字段会引发错误吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

请勿设置InvoiceId = invoice.Id。 原因是,在数据库中,引用是键,但是在C#中,引用是对象本身。因此,如果设置child.ParentId = Parent.Id不够(并且根本不需要),但是设置child.Parent = Parent会很好。