Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将实体保存在具有2个外键的表中_C#_Sql Server_Entity Framework_Foreign Keys - Fatal编程技术网

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

C# 将实体保存在具有2个外键的表中,c#,sql-server,entity-framework,foreign-keys,C#,Sql Server,Entity Framework,Foreign Keys,我在EF6工作。我有一张这样结构的桌子: Id | CompanyId | CourierId | DateOfCreation CompanyId和CourierId可以为空,因为如果存在一个值,另一个值为空 这些列是表companys和Couriers的外键 当我试图保存此表中的某些实体时,出现错误: INSERT语句与外键约束“FK_senddenVoices_Couriers”冲突。冲突发生在数据库“Courier”表“dbo.Couriers”列“Id”中 若我理解正确,Courie

我在EF6工作。我有一张这样结构的桌子:

Id | CompanyId | CourierId | DateOfCreation
CompanyId
CourierId
可以为空,因为如果存在一个值,另一个值为空

这些列是表
companys
Couriers
的外键

当我试图保存此表中的某些实体时,出现错误:

INSERT语句与外键约束“FK_senddenVoices_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; }
}
然后保存它

 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;
    }

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

保存此实体时,此值
0
将存储在您的实体中,SQL Server将尝试使用
Id=0
信使建立FK关系,因为您正在存储该值。是否存在Id为0的
Courier

如果
isfreeler
为false,您很可能希望将
CourierId
初始化为
null

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;
}
然后SQL Server将接收一个
NULL
并将其存储为
CourierId
,而不必担心检查FK关系

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

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
实例-您已经设置了外键值(
CourierId
CompanyId
)-只需保存您的实体,下次加载时,引用的对象也将自动为您设置。

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

保存此实体时,此值
0
将存储在您的实体中,SQL Server将尝试使用
Id=0
信使建立FK关系,因为您正在存储该值。是否存在Id为0的
Courier

如果
isfreeler
为false,您很可能希望将
CourierId
初始化为
null

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;
}
然后SQL Server将接收一个
NULL
并将其存储为
CourierId
,而不必担心检查FK关系

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

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
实例-您已经设置了外键值(
CourierId
CompanyId
)-只需保存您的实体,下次加载时,引用的对象也将自动为您设置。

您的表准备好接受这些列中的空值了吗?是否可以提供用于创建表的SQL脚本?否,错误表示您正在尝试将
CourierId
值存储到表中,该值在
Courier
中不存在,因此违反了FK约束。您能告诉我们创建并保存该实体的代码吗?您的表准备好接受这些列中的空值了吗?是否可以提供用于创建表的SQL脚本?否,错误表示您正在尝试将
CourierId
值存储到表中,该值在
Courier
中不存在,因此违反了FK约束。你能告诉我们创建实体并保存它的代码吗?