【发布时间】:2015-08-17 13:18:07
【问题描述】:
我正在尝试为实体框架中的订单建模树结构。现在我做了以下事情:
public class ProjectModel
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int CustomerId { get; set; }
public virtual List<ProjectNode> Nodes { get; set; }
}
public class ProjectNode
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public string Path { get; set; }
public int? ParentId { get; set; }
[ForeignKey("ParentId")]
public virtual List<ProjectNode> Children { get; set; }
}
我需要做的是在ProjectNode 的任何级别获取对根ProjectModel 的引用,以便授权给定用户实际上有权查看和更改包含ProjectNode 的项目.
public class ProjectNode {
public int ProjectId { get; set; } //<-- this
...
public class ProjectModel {
[Key]
public int Id { get; set; } //<-- containing the value of this
}
我的问题是是否有可能在树结构的每一层都填充一个理论上的 ProjectId 属性,或者我是否需要手动设置它。
我有一些工作,乍一看似乎允许此功能,但经过进一步调查,仅填充了 ProjectId 的 ProjectNodes 包含在 ProjectModel 的 Nodes 属性中。
在我看来,通过结构向后递归以到达根节点是非常低效的。
【问题讨论】:
-
您应该在各个表中保持键名相同。
Id在ProjectModel下应该是ProjectModelID并且在ProjectNode下具有相同的名称。它使所有内容都易于阅读。至于你的问题,你是在问孩子没有父母能不能存在? -
我的问题(我可能措辞不佳)是:有没有办法自动将根
ProjectModelId 传播到它下面的所有ProjectNodes?或者现在我想得更多,甚至更好,将ProjectModel的CustomerId传播给任何和所有后代?我让它工作,以便根ProjectModel直接下的所有后代自动从模型中获取一个字段...
标签: asp.net entity-framework asp.net-web-api tree ef-code-first