在具有2个外键的表中保存实体

时间:2015-08-11 08:02:20

标签: c# sql-server entity-framework foreign-keys

我使用EF6。我有这种结构的表:

Id | CompanyId | CourierId | DateOfCreation

CompanyIdCourierId可以为null,因为如果存在一个值,则另一个值为null。

这些列是表CompaniesCouriers的外键。

当我尝试在此表中保存某个实体时,我收到错误:

  

INSERT语句与FOREIGN KEY约束“FK_SendedInvoices_Couriers”冲突。冲突发生在数据库“Courier”,表“dbo.Couriers”,列'Id'。

如果我理解正确的问题,CourierId为空且无法映射到Couriers表。

但我不知道如何解决它。有什么建议吗?

感谢。

更新:

所以真正的实体看起来像:

public partial class SendedInvoice
{
    public int Id { get; set; }
    public int SendingHistoryId { get; set; }
    public Nullable<int> CourierId { get; set; }
    public Nullable<int> CompanyId { get; set; }

    public virtual Company Company { get; set; }
    public virtual Courier Courier { get; set; }
    public virtual InvoicesSendingHistory InvoicesSendingHistory { get; set; }
}

这就是我创建实体的方式。

private static SendedInvoice InitSendedInvoiceModel(InvoiceData data, int historyId, bool isFreelance)
        {
            var sendedInvoice = new SendedInvoice
                                {
                                    CompanyId = isFreelance ? 0 : data.CustomerId,
                                    SendingHistoryId = historyId,
                                    CourierId = isFreelance ? data.CustomerId : 0
                                };
            return sendedInvoice;
        }

然后保存。

 public bool AddInvoiceServiceRun(SendedInvoice data)
    {
        var courier = _context.Couriers.FirstOrDefault(d => d.Id == data.CourierId);
        var company = _context.Companies.FirstOrDefault(d => d.Id == data.CompanyId);

        data.Company = company;
        data.Courier = courier;
        _context.SendedInvoices.Add(data);
        _context.SaveChanges();

        return true;
    }

1 个答案:

答案 0 :(得分:0)

您正在将XWalkView值初始化为此处CourierId的数值(如果0为false):

isFreelance

保存此实体时,此值private static SendedInvoice InitSendedInvoiceModel(InvoiceData data, int historyId, bool isFreelance) { var sendedInvoice = new SendedInvoice { CompanyId = isFreelance ? 0 : data.CustomerId, SendingHistoryId = historyId, CourierId = isFreelance ? data.CustomerId : 0 }; return sendedInvoice; } 将存储在您的实体中,并且SQL Server将尝试与0建立与Couriers的FK关系 - 因为您正在存储那个价值。是Id = 0 Courier是否存在?

最有可能的是,如果Id = 0为假,您希望将CourierId初始化为null ...

isFreelance

然后 SQL Server将收到private static SendedInvoice InitSendedInvoiceModel(InvoiceData data, int historyId, bool isFreelance) { var sendedInvoice = new SendedInvoice { CompanyId = isFreelance ? null : data.CustomerId, SendingHistoryId = historyId, CourierId = isFreelance ? data.CustomerId : null }; return sendedInvoice; } 并将其存储为NULL,而不用担心检查FK关系....

旁注:这里的代码完全是多余的

CourierId

您无需查找public bool AddInvoiceServiceRun(SendedInvoice data) { var courier = _context.Couriers.FirstOrDefault(d => d.Id == data.CourierId); var company = _context.Companies.FirstOrDefault(d => d.Id == data.CompanyId); data.Company = company; data.Courier = courier; _context.SendedInvoices.Add(data); _context.SaveChanges(); return true; } Courier个实例 - 您已经设置外键值(Company和{{ 1}}) - 只需保存您的实体,下次加载实体时,也会自动为您设置引用的对象。