C# 将实体保存在具有2个外键的表中
我在EF6工作。我有一张这样结构的桌子: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
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约束。你能告诉我们创建实体并保存它的代码吗?