EF Core - иерархия с использованием Composite Design Pattern и CTE - PullRequest
0 голосов
/ 29 апреля 2020

Хочу создать каталог товаров. На каждом узле могут быть каталоги или товары.

Я решил использовать шаблон составного дизайна.

Я буду загружать узел с детьми, используя CTE. К сожалению, возникла проблема, поскольку EF Core не добавляет parentId в таблицу CategoryProducts. Кроме того, класс (Category as my Composite) имеет свой собственный класс CategoryDetails, а (Product as my 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 Core Настройка: enter image description here

1 Ответ

0 голосов
/ 29 апреля 2020

К сожалению, я ничего не знаю о рекурсии 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);
    });
}
...