【问题标题】:EF6 code-first insert foreign key constraint failEF6 代码优先插入外键约束失败
【发布时间】:2019-07-19 12:07:50
【问题描述】:

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

我在 Invoices 表中有一些记录,稍后我想在 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 - 然后它可以工作,我可以将我的数据插入到数据库中。

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

提前致谢

【问题讨论】:

    标签: c# entity-framework-6


    【解决方案1】:

    不要设置 InvoiceId = invoice.Id。 原因是,在数据库中,引用是键,但在 C# 中,引用是对象本身。所以如果你设置 child.ParentId = Parent.Id 是不够的(而且根本不需要),但是设置 child.Parent = Parent 就可以了。

    【讨论】:

    • 这是我尝试过的事情之一,但这样做我在数据库中为 InvoiceId 字段获得了空 Guid
    • @S.Martignier 您需要将 Id 字段配置为 Identity 列,以避免 EF 为您插入 Guid.Empty
    • 您是在说 Invoice 中的 Id 字段吗?因为它被标记为身份TableColumn(ColumnType.Id)] [JsonProperty(PropertyName = "Id")] [IDXTable(IndexType.FullIndex)] public Guid Id { get; set; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多