如何处理不可为空的导航属性?

问题描述 投票:0回答:1

我有两个班级:

public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Document> Documents { get; set; }
    }

public class Document
    {
        public int Id { get; set; }
        public string SerialNumber { get; set; }
        public int EmployeeId { get; set; }
    }

我希望在创建(例如大摇大摆)员工时,如果未提供至少一个文档,则会发生异常。

{
  "name": "Victor",
  "documents": [
    {
      "serialNumber": "12345"
    }
  ]
}
// must give 200OK
{
  "name": "Victor"
}
// must give error

我尝试在 FluentApi 中配置它们:

modelBuilder.Entity<Employee>()
            .HasMany(e => e.Documents)
            .WithOne()
            .HasForeignKey(d => d.EmployeeId)
            .IsRequired();

        modelBuilder.Entity<Document>()
            .HasOne<Employee>()
            .WithMany(e => e.Documents)
            .HasForeignKey(d => d.EmployeeId)
            .IsRequired();

但即使我不提供文件,员工也已创建。

c# entity-framework
1个回答
0
投票

Fluent API 配置用于配置实体及其属性之间的关系。但是,它不会验证在创建或更新实体时输入的数据。

要实现您正在寻找的验证,您可以将验证属性添加到 Employee 类属性中。具体来说,可以在Documents属性中添加[Required]属性,保证创建员工时至少需要一个文档

您还应该包括 Key 属性,以便 EF 知道这将成为该表的主键。然后将 ForiegnKey 属性添加到 EmloyeeId,这将告知 EF 该关系。

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }

    [Required(ErrorMessage = "Documents are required.")]
    public ICollection<Document> Documents { get; set; }

    public string Name { get; set; }
}

public class Document
{
    public int Id { get; set; }
    public string SerialNumber { get; set; }
    [ForeignKey("Employee")]
    public int EmployeeId { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.