【发布时间】:2018-03-28 11:49:45
【问题描述】:
我正在与一个外部系统进行集成,他们在该系统中使用大量复合键,并且通常是 strings。我现在面临一个问题,我需要制作一个复合外键nullable。如果该值是int,我可以使用int? 将其标记为可为空,但这在这里是不可能的。我想我必须使用流利的 api,但如果可以使用数据注释,那是首选方式。更难的是,外键的第一部分也用作主键的第一部分,因此不能为空。
BillCurrency 和 DisbCurrency for FeeCalculation 是下面需要为空的键。除了可以为空的部分之外,创建的模型都是有效的。
明显的异常信息:
INSERT 语句与 FOREIGN KEY 约束冲突 “FK_dbo.FeeCalculations_dbo.ExchangeRates_BusinessSystemId_BillCurrency”。数据库“Project.Database”中发生冲突,表 “dbo.ExchangeRates”。声明已终止。
public class FeeCalculation
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
public string BillCurrency { get; set; }
[ForeignKey("BusinessSystemId,BillCurrency")]
public virtual ExchangeRate BillCurrencyObject { get; set; }
public string DisbCurrency { get; set; }
[ForeignKey("BusinessSystemId,DisbCurrency")]
public virtual ExchangeRate DisbCurrencyObject { get; set; }
}
public class ExchangeRate
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string ForeignCurrency { get; set; }
public string HomeCurrency { get; set; }
public DateTime EffectiveDate { get; set; }
public double Rate { get; set; }
}
【问题讨论】:
-
string列默认可以为空。问题很可能来自共享的BusinessSystemId列,它是 PK 的一部分(因此是必需的)。我不确定 EF(数据库)是否支持“部分”可为空的复合 FK。 -
@IvanStoev 是的,我知道字符串可以为空。快速修复是删除 FK,但无论如何都会有一些数据库完整性。
-
关键是我不相信你可以在关系数据库中拥有这样的 FK。您是映射到现有数据库还是创建自己的数据库?
标签: c# entity-framework entity-framework-6