首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用组合设计模式和CTE的EF核心层次结构

使用组合设计模式和CTE的EF核心层次结构
EN

Stack Overflow用户
提问于 2020-04-29 14:05:11
回答 1查看 302关注 0票数 0

我想创建一个产品目录。每个节点上可能有目录或产品。

我决定使用复合设计模式。

我将使用CTE下载包含子节点的节点。不幸的是,有一个问题,因为EF核心没有在CategoryProducts表中添加parentId。此外,这个类(Category as my Composite)有自己的CategoryDetails类,(Product as my Leaf)有自己的ProductDetails类。

如何配置EF Core以递归方式从树中获取节点?CTE是个好主意吗?

代码语言:javascript
复制
public enum CategoryProductType
{
    Category,
    Product
}

public abstract class CategoryProduct
{
    public Guid Id { get; private set; }
    public string Name { get; private set; }
    public CategoryProductType Type { get; private set; }

    protected CategoryProduct(Guid id, string name, CategoryProductType type)
    {
        Id = id;
        Name = name;
        Type = type;
    }

}

代码语言:javascript
复制
public class Category : CategoryProduct
{
    public string Code { get; private set; }
    public CategoryDetails CategoryDetails { get; private set; }

    private ICollection<CategoryProduct> _children { get; set; } = new Collection<CategoryProduct>();
    public IEnumerable<CategoryProduct> Children => _children;

    public Category(Guid id, string name, string code) 
        : base(id, name, CategoryProductType.Category) 
    {
        Code = code;
    }

}

代码语言:javascript
复制
public class CategoryDetails
{
    public Guid CategoryId { get; private set; }
    public Category Category { get; private set; }
    public string Description { get; private set; }

    private CategoryDetails() { }

    public CategoryDetails(Category category, string description)
    {
        Category = category);
        Description = description);
    }

}

代码语言:javascript
复制
public class Product : CategoryProduct
{
    public string Index { get; private set; }
    public ProductDetails ProductDetails { get; private set; }

    public Product(Guid id, string name, string index) 
        : base(id, name, CategoryProductType.Product) 
    {
        SetIndex(index);
    }

}

EF核心设置:

EN

回答 1

Stack Overflow用户

发布于 2020-04-29 17:11:51

不幸的是,我对CTE递归一无所知。

然而,这是一个关于我如何使用EF Core建模分层结构(即树)的示例,希望它能对您有所帮助。

代码语言:javascript
复制
public class TreeNode
{
    public int TreeNodeId { get; private set; }
    public int? ParentTreeNodeId { get; set; }
    public TreeNode ParentTreeNode { get; set; }
    public List<TreeNode> ChildrenTreeNodes { get; set; }
}
代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TreeNode>(entity =>
    {
        entity.HasOne(n => n.ParentTreeNode)
            .WithMany(n => n.ChildrenTreeNodes)
            .HasForeignKey(n => n.ParentTreeNodeId);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61495273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档