Fluent API中的亲子关系

本文关键字:关系 API Fluent | 更新日期: 2023-09-27 17:59:36

好吧,这越来越荒谬了,因为事实证明这比任何权利都要困难得多。

如果我使用没有FluentAPI映射的原始代码,那么我有一个ParentID字段没有使用,而是使用了一个名为Node_ID的新字段。

public class Node {
  public long ID { get; private set; }
  public long ParentID { get; set; }
  public ICollection<Node> Children { get; set; }
}

以下是我的各种尝试:

protected override void OnModelCreating(DbModelBuilder mb)
{
  mb.Entity<Node>()
    .HasMany<Node>(h => h.Children)
    .WithOptional()
    .HasForeignKey(h => h.ParentID);
}

DbUpdateException:无法确定依赖操作的有效顺序。依赖项可能由于外键约束、模型要求或存储生成的值而存在。

protected override void OnModelCreating(DbModelBuilder mb)
{
  mb.Entity<Node>()
    .HasMany<Node>(h => h.Children)
    .WithOptional()
    .Map(m => m.MapKey("ParentID"));
}

MetadataException:指定的架构无效。错误:(82,6):错误0019:类型中的每个属性名称都必须是唯一的。已定义属性名称"ParentID"。

[ForeignKey("ParentID")]
public ICollection<Node> Children { get; set; }
protected override void OnModelCreating(DbModelBuilder mb)
{
  mb.Entity<Node>()
    .HasMany<Node>(h => h.Children)
    .WithOptional()
}

DbUpdateException:无法确定依赖操作的有效顺序。依赖项可能由于外键约束、模型要求或存储生成的值而存在。

更新

使用上面第一次尝试代码(.HasForeignKey)中的Fluent API代码,并通过使ParentID为null(public long?ParentID),我已经成功映射了数据库。在不使FK为null的情况下,有什么方法可以做到这一点吗?当不存在父项时,我希望密钥为0。如果没有,哦,好吧,我会处理的。

Fluent API中的亲子关系

没有办法避免可为null的ParentId-您告诉EF父级是可选的(否则您将无法使用该表),并且由于相关的FK属性必须为null。