【问题标题】:Tree structure with reference to root in Entity Framework实体框架中参考根的树结构
【发布时间】: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 属性,或者我是否需要手动设置它。

我有一些工作,乍一看似乎允许此功能,但经过进一步调查,仅填充了 ProjectIdProjectNodes 包含在 ProjectModelNodes 属性中。

在我看来,通过结构向后递归以到达根节点是非常低效的。

【问题讨论】:

  • 您应该在各个表中保持键名相同。 IdProjectModel 下应该是ProjectModelID 并且在ProjectNode 下具有相同的名称。它使所有内容都易于阅读。至于你的问题,你是在问孩子没有父母能不能存在?
  • 我的问题(我可能措辞不佳)是:有没有办法自动将根ProjectModel Id 传播到它下面的所有ProjectNodes?或者现在我想得更多,甚至更好,将ProjectModelCustomerId 传播给任何和所有后代?我让它工作,以便根ProjectModel 直接下的所有后代自动从模型中获取一个字段...

标签: asp.net entity-framework asp.net-web-api tree ef-code-first


【解决方案1】:

感谢@TestWell 这个答案 -

显然,要让 EF 自动填充 ProjectNode 上的 ProjectId 属性,我需要做的就是将 ProjectModel 中的 Id 属性的名称更改为 ProjectId

不幸的是,如果我将CustomerId 属性添加到我希望从节点根ProjectModel 上的同名属性自动填充的ProjectNode 中,这似乎不起作用,我意识到这是我正在尝试做的更有效的解决方案。

【讨论】:

  • 尝试在您的ProjectNode 实体中的public int CustomerId { get; set; } 下添加public virtual Customer Customer { get; set; },如果您还没有这样做的话。此外,请在答案的上/下投票按钮下打勾以“标记为答案”并给自己一些声誉。如果有人回答您的问题,请不要忘记这样做:)
  • 再想一想,你不需要将CustomerId添加到ProjectNode..只需将public virtual ProjectModel Model { get; set; }添加到ProjectNode并在需要时调用nodeVariable.Model.CustomerIdCustomerId。这是更正确的做法,忽略我之前的评论,除了关于标记答案的部分。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多