如何检查对象是孩子还是孩子的孩子

时间:2016-02-15 03:52:08

标签: c# entity-framework-6

我正在编写一个C#Web API 2 Web服务,其中一个对象有一个外键int引用来指定父对象。

检查正在编辑的对象不是同一个对象的子对象,或者不是孩子的孩子的最佳方法是什么?

我正在使用EF6。

以下是DbSet对象的示例:

public class User : IDbSet, IParent
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public int parentId { get; set; }
}

1 个答案:

答案 0 :(得分:0)

添加Parent导航属性:

public class User : IDbSet, IParent
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    // notice that parent's id should be 
    // optional [at some point your parent will have to be null], 
    // thus we make the foreign key nullable
    public int? parentId { get; set; } 

    [ForeignKey("parentId")]
    public virtual User Parent { get; set; }
}

然后你可以做检查:

// I am not parent of myself
if(editedUser.Parent != editedUser) { ... }

或:

bool AmIIntheChain()
{
  var curUserParent = editedUser.Parent;        
  while(curUserParent != null)
  {
   if(curUserParent == editedUser) 
      return false;
    curUserParent = curUserParent.Parent;
  }
  return true;
}

这需要进行健全性检查,不要根据您可能拥有的数据进行无限循环,但是您会明白

您还可以通过Children属性来改善这一点:

public class User : IDbSet, IParent
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public int? parentId { get; set; } 
    public virtual User Parent { get; set; }
    public virtual ICollection<User> Children { get;set; }
}

在你的模型配置上:

modelBuilder.Entity<User>()
      .HasMany(t => t.Children)
      .WithOptional(t => t.Parent)
      .HasForeignKey(t => t.parentId);

所以你也可以检查孩子,而不仅仅是“上链”