编程语言
首页 > 编程语言> > 如何在asp.net MVC中为分层数据构建自引用模型对象?

如何在asp.net MVC中为分层数据构建自引用模型对象?

作者:互联网

我正在尝试了解如何为分层数据建立自参考模型.最终,我将创建一个类别树.

我桌上什么都没有.在确定好结构后,我将创建表.我现有的对象的定义如下:

public class Categories
{
    public Int64 catID { get; set; }
    public Int64? parentCatID { get; set; }
    public string catName { get; set; }
    public string catDescription { get; set; }
}

我的假存储库填充以下类别:

// Fake hardcoded list of categories
private static IQueryable<Categories> fakeCategories = new List<Categories> {
    new Categories { catID = 1, parentCatID = null, catName = "Root", catDescription = "" },
    new Categories { catID = 2, parentCatID = 1, catName = "Category w/subs", catDescription = "" },
    new Categories { catID = 3, parentCatID = 1, catName = "Category no subs but now has subs", catDescription = "" },
    new Categories { catID = 4, parentCatID = 2, catName = "Zub Cat", catDescription = "" },
    new Categories { catID = 5, parentCatID = 2, catName = "Sub Cat", catDescription = "" },
    new Categories { catID = 6, parentCatID = null, catName = "Another Root", catDescription = "" },
    new Categories { catID = 7, parentCatID = null, catName = "Ze German Root", catDescription = "" },
    new Categories { catID = 8, parentCatID = 3, catName = "Brand new cats", catDescription = "" },
    new Categories { catID = 9, parentCatID = 8, catName = "Brand new cats sub", catDescription = "" },
}.AsQueryable();

我对如何使其成为自引用对象(可以将其发送到视图进行显示)感到困惑.我在想控制器将是这样的:

public ActionResult CategoryTree()
{
    var cats = fakeRepository.Categories.ToList();
    return View(cats);
}

我不知道我是否正确解决了这个问题.我将使用递归的自定义HtmlHelper方法显示类别树.

我如何使Categories成为自引用对象?

编辑:改写的问题

我开始认为我是在问一个沉思的问题:-)

请检查以下代码:

[Table]
public class Category
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public Int64 catID { get; set; }
    public Int64? parentCatID { get; set; }
    public string catName { get; set; }
    public string catDescription { get; set; }

    internal EntityRef<Category> _category;
    [Association(ThisKey = "parentCatID", Storage = "_category")]
    public Category category {
        get { return _category.Entity; }
        internal set { _category.Entity = value; }
    }
}

这段代码可以编译,我不必更改我的假存储库.我感觉好像我错过了一些东西.我不确定如何进行测试以查看其是否有效.我正在竭尽所能.

我什至都不100%知道正确的问题是什么.我要去玩这个……看看我是否遇到错误或它是否按我期望的方式工作.我可能会在这里再次编辑.

编辑2

看来Category.category只是返回null.而且,它似乎不在任何类型的列表中.我不确定我是否正确建立了关系.

有什么想法吗?

解决方法:

public class Category   // an instance of the class is just ONE category
{
    public Int64 Id { get; set; }
    public Category Parent { get; set; }        // A parent link, EF will  handle this for you using an Association
    public List<Category> Children {get; set;}  // Replace this when you move to EF or L2S
    public string Name { get; set; }
    public string Description { get; set; }
}

如果在Visual Studio中使用Linq2Sql或Entity Framework设计器,则可以创建一个名为“ Category”的实体(或类),然后再创建一个与自身的关联.任一个设计器都会在实体/类上自动创建一个collection属性,该属性允许您导航到子级集合.

这是您的Linq2Sql图可能看起来像:

关联应如下所示:

然后,您的伪造的存储库可以简单地使用Linq2Sql类,如下所示:

Category root = new Category() { Name = "Root", Parent = null };
Category child1 = new Category() { Name = "Child 1", Parent = root };
Category child2 = new Category() { Name = "Child 2", Parent = root };

Linq2Sql将为您“神奇地”设置“根”上的“儿童”集合.

标签:hierarchical-data,asp-net,c,asp-net-mvc
来源: https://codeday.me/bug/20191023/1916024.html