Fluent API中的父子关系

时间:2011-06-20 20:18:38

标签: c# entity-framework code-first fluent-interface

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

如果我使用没有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可以为空(public long?ParentID),我已经让数据库成功映射。有没有办法在不使FK可以为空的情况下做到这一点?如果没有父级,我希望密钥为0。如果没有,哦,我会处理。

1 个答案:

答案 0 :(得分:1)

没有办法避免可以为空ParentId - 你告诉EF父是可选的(否则你将无法使用该表)并且因为相关的FK属性必须是可空的。