【问题标题】:Entity Framework: Foreign Key实体框架:外键
【发布时间】:2023-04-02 02:40:01
【问题描述】:

我有 2 个模型类:

public class Nurse
{
    public int Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string Surname { get; set; }

    [Required]
    public string AddressLine1 { get; set; }
    [Required]
    public string AddressLine2 { get; set; }
    public string AddressLine3 { get; set; }
    public string AddressLine4 { get; set; }

    [Required]
    [EmailAddress]
    public string EmailAddress { get; set; }

    [Required]
    [Phone]
    public string ContactNumber { get; set; }

    [Required]
    public DateTime DateOfBirth { get; set; }

    [Required]
    public DateTime RegistrationDate { get; set; }


    //Foreign Keys

    public int PaymentId { get; set; }
    [ForeignKey("PaymentId")]
    public virtual Payment Payment { get; set; }


    public int BranchId { get; set; }
    [Required]
    [ForeignKey("BranchId")]
    public virtual Branch Branch { get; set; }
}  // Cls

public class Payment
{
    public int Id { get; set; }

    //Type of String instead of to allow for starting zeros
    [RegularExpression("^[0-9]+$")]
    public string SortCode { get; set; }

    [RegularExpression("^[0-9]+$")]
    public string BankAccountNumber { get; set; }

    [RegularExpression("^[0-9]+$")]
    public string ChequeNumber { get; set; }

    public DateTime DateReceived { get; set; }

    public string Notes { get; set; }

    //Foreign Keys
    public int PaymentTypeId { get; set; }
    [Required]
    [ForeignKey("PaymentTypeId")]
    public PaymentType PaymentType { get; set; }

    public int NurseId { get; set; }
    [Required]
    [ForeignKey("NurseId")]
    public Nurse Nurse { get; set; }
}  // Cls

每当我尝试运行应用程序时,我都会收到以下错误:

抛出异常:EntityFramework.dll 中的“System.InvalidOperationException”

附加信息:类型“PNA_Model.Nurse”的属性“Payment”上的 ForeignKeyAttribute 无效。在依赖类型“PNA_Model.Payment”上找不到外键名称“PaymentId”。 Name 值应该是逗号分隔的外键属性名称列表。

每笔款项属于一名护士,但并非每位护士都有一笔款项。

如果我将 Payment 的“Id”属性更改为“PaymentId”,错误就会消失,根据错误消息,这是有道理的。

但是我认为 EF 足够聪明,可以自己解决这个问题,而且我与其他类及其“Id”属性也有类似的情况,但我没有收到它们的错误消息。

有什么想法吗?

谢谢

【问题讨论】:

  • 您是否尝试将ForeignKeyAttribute 添加到PaymentId 而不是Payment
  • 您使用的是什么版本的 EF? EF6、EF Core?
  • @krillgar Version=6.0.0.0 根据 App.config 文件
  • @Mats391 刚试了一下,得到以下错误:EntityFramework.dll 中出现“System.Data.Entity.ModelConfiguration.ModelValidationException”类型的未处理异常附加信息:检测到一个或多个验证错误在模型生成期间:Nurse_Payment_Source::多重性在关系“Nurse_Payment”中的角色“Nurse_Payment_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是“*”。
  • @Shanie 您的 DataAnnotations 似乎都正确,您确定在模型构建中没有使用 fluent api 定义任何内容吗?

标签: c# entity-framework entity-framework-6


【解决方案1】:

好的,我想我发现我做错了。

首先,实体框架要求在一对一关系中,依赖项(付款)的主键也必须是外键。

所以在“护士”类中,我不需要“PaymentId”属性,因为在支付类中,密钥 (Payment.Id) 也将是护士的外键,因此等于护士密钥 (Nurse 。ID)。 在 Payments 类中,我应该删除“NurseId”属性,因为这将在 Key/ForeignKey 中处理

我可以通过 2 种方式完成剩下的工作。

  1. 在支付类 - 在 Key (Payment.Id) 上使用数据注解

    [ForeignKey("Nurse")]
    public int Id { get; set; }
    
  2. 在 PaymentConfig 类中 -

    HasRequired(p => p.Nurse)
         .WithOptional(n => n.Payment);
    

如果您还想指定,第二个选项可能会更好

WillCascadeOnDelete(false)

感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多