gpt4 book ai didi

asp.net-mvc - asp.net mvc 中的类别/子类别

转载 作者:行者123 更新时间:2023-12-04 18:36:55 26 4
gpt4 key购买 nike

我们正在打造一个类似 https://www.etsy.com/ 的市场.我们在对列表进行分类时遇到了问题。我们希望将 Listing 中的项目分为 3 个级别,f.ex 必须按以下顺序分类:

 Category 1 
Sub Category 1.1
Sub Category 1.1.1

一件重要的事情是,当你选择一个类别时,f.ex.电子产品,然后在子类别中,您只能看到个人电脑、智能手机、电视等。

这就是我们现在所拥有的
 public class Listing
{
public int ListingId { get; set; }
public String Name { get; set; }

public int Subcategory2Id { get; set; }
public virtual Subcategory2 Subcategory2 { get; set; }
}



public class Category
{
public int CategoryId { get; set; }
public String CategoryName { get; set; }

public virtual ICollection<Subcategory1> Subcategory1s { get; set; }
}



public class Subcategory1
{
public int Subcategory1Id { get; set; }
public String Subcategory1Name { get; set; }

public int CategoryId { get; set; }
public virtual Category Categories { get; set; }

public virtual ICollection<Subcategory2> Subcategory2s { get; set; }
}



public class Subcategory2
{
public int Subcategory2Id { get; set; }
public String Subcategory2Name { get; set; }

public int Subcategory1Id { get; set; }
public virtual Subcategory1 Subcategory1s { get; set; }

public virtual ICollection<Listing> Listings { get; set; }
}

在 IdentityModels-ApplicationDbContext 中,我们有
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Listing> Listings { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Subcategory1> Subcategory1s { get; set; }
public DbSet<Subcategory2> Subcategory2s { get; set; }

public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}

public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}

问题是我们不确定这是他正确的做法,我们不知道如何进行,意思是当您创建列表时,您必须有 3 个下拉列表,您可以在其中选择相应的类别。所以首先你选择你的类别,然后你可以选择子类别 1 等等...

最佳答案

您绝对不应该有多个类别/子类别实体。一个类别可以有一个父级,也可以有子级,但它们都是“类别”。

public class Category
{
public int Id { get; set; }

public int? ParentId { get; set; }
public virtual Category Parent { get; set; }

public virtual ICollection<Category> Children { get; set; }
}
ParentId可以为空,因为顶级类别没有父类别。

Entity Framework 往往会被自引用关系弄糊涂,所以你可能需要一些流畅的配置来帮助它:
public class Category
{
// properties

public class Mapping : EntityTypeConfiguration<Category>
{
public class Mapping()
{
HasOptional(m => m.Parent).WithMany(m => m.Children);
}
}
}

然后,在您的上下文中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new Category.Mapping());
}

有了所有这些,当你在你的“电子”类别中时,你可以简单地通过迭代它来显示子类别 Children属性(property)。

更新

如果您需要完整的层次结构而不是一次只需要一个级别,您有几种选择。首先,您可以在查询时包含多个级别:
db.Categories.Include("Children.Children");

但是,这不是很有效,而且我绝对不建议比高等教育 child 更深入地研究。然而,这就是你所要求的,所以这仍然是一个可行的方法。

其次,您可以创建一个存储过程来为您遍历层次结构。它有点复杂,但结合了 WITHUNION ALL ,您可以创建层次结构的平面表示,然后递归使用 LINQ 的 GroupBy将其恢复为分层结构。

@Hackerman 建议使用 HIERARCHYID 的最后一个潜在的第三个选项,但不幸的是,要做到这一点,您必须完全删除 Category从您的 EF 上下文中删除,这也意味着删除与它的任何直接关系。要将产品与类别相关联,您只能存储 id(而不是作为外键),然后在第二步中使用该 id 手动查找类别。不幸的是,虽然这个解决方案使处理层次结构更容易,但它使其他所有事情都变得更加困难。不管怎样,这取决于你。

关于asp.net-mvc - asp.net mvc 中的类别/子类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com