EF核心--使用复合设计模式和CTE的层次结构。

问题描述 投票:0回答:1

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

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

我将使用CTE下载带有子节点的节点。不幸的是有一个问题,因为EF Core没有在CategoryProducts表中添加parentId。另外(Category作为我的复合类)有自己的CategoryDetails类,(Product作为我的Leaf)有自己的ProductDetails类。

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

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;
    }

}

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;
    }

}

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);
    }

}

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核心设置。enter image description here

entity-framework-core composite
1个回答
0
投票

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

然而,这是一个关于我如何用EF Core模拟一个分层结构(即一棵树)的例子,希望它能帮助你。

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; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TreeNode>(entity =>
    {
        entity.HasOne(n => n.ParentTreeNode)
            .WithMany(n => n.ChildrenTreeNodes)
            .HasForeignKey(n => n.ParentTreeNodeId);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.