【问题标题】:C# -> Entity Framework 6.1.3 -> Composite nullable foreign key stringC# -> Entity Framework 6.1.3 -> 复合可空外键字符串
【发布时间】:2018-03-28 11:49:45
【问题描述】:

我正在与一个外部系统进行集成,他们在该系统中使用大量复合键,并且通常是 strings。我现在面临一个问题,我需要制作一个复合外键nullable。如果该值是int,我可以使用int? 将其标记为可为空,但这在这里是不可能的。我想我必须使用流利的 api,但如果可以使用数据注释,那是首选方式。更难的是,外键的第一部分也用作主键的第一部分,因此不能为空。

BillCurrencyDisbCurrency 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


【解决方案1】:

结果证明模型没有问题,它是一个 FeeCalculation 值已损坏并试图插入一个在 ExchangeRate 中不存在的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2021-04-30
    • 2022-09-22
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2017-10-08
    相关资源
    最近更新 更多