Fluent API 等效于数据注释

Fluent API equivalent for Data Annotation

我无法使用 DataAnnotations 来设置键和外键,因为我正在使用 .NET 框架。我需要确认相同的 fluentAPI 等价物。

下面是我尝试过的,但显示“ALTER TABLE 语句与 FOREIGN KEY SAME TABLE 约束冲突”

型号:

public class Item
{
   
    public string ItemNo{ get; set; }
    public string parentItemNo{ get; set; }

  // Adding below two navigation properties to existing model
   public virtual Item Parent { get; set; }
   public virtual ICollection<Item> Children { get; set; } = new List<Item>();
 
}

数据库上下文:

        modelBuilder.Entity<Item>()
            .HasKey(e => e.ItemNo )
              .HasName("Item[=12=]");
        
         // Adding below lines to create foreign key using fluent API
         entity.HasOne(e => e.Parent)
            .WithMany(e => e.Children)
            .HasForeignKey(e => e.ParentItemNo );

当您尝试在同一个 table 中创建 PK-FK 关系时,出现异常:

The ALTER TABLE statement conflicted with the FOREIGN KEY SAME TABLE constraint

表明您的现有数据存在问题。

在你的例子中,在 Item table 中,有 ParentItemNo 个空字符串,这不等同于 NULL,所以数据库试图将这些与其他将空字符串作为其 ItemNo 的记录进行匹配,而这并不存在。

使用以下命令将这些空字符串替换为 NULLs 可解决问题:

UPDATE Item 
SET ParentItemNo = NULL 
WHERE ParentItemNo = ''