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
的记录进行匹配,而这并不存在。
使用以下命令将这些空字符串替换为 NULL
s 可解决问题:
UPDATE Item
SET ParentItemNo = NULL
WHERE ParentItemNo = ''
我无法使用 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
的记录进行匹配,而这并不存在。
使用以下命令将这些空字符串替换为 NULL
s 可解决问题:
UPDATE Item
SET ParentItemNo = NULL
WHERE ParentItemNo = ''