我使用EF6。我有这种结构的表:
Id | CompanyId | CourierId | DateOfCreation
CompanyId
和CourierId
可以为null,因为如果存在一个值,则另一个值为null。
这些列是表Companies
和Couriers
的外键。
当我尝试在此表中保存某个实体时,我收到错误:
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;
}
答案 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}}) - 只需保存您的实体,下次加载实体时,也会自动为您设置引用的对象。