我正在编写一个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; }
}
答案 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);
所以你也可以检查孩子,而不仅仅是“上链”