实体框架复杂的树结构

时间:2014-09-14 20:12:50

标签: c# entity-framework

我有一个复杂的树结构,我正在尝试使用代码优先方法创建。 主要想法是一个有孩子们的集体。每个孩子可以使用同一类型的本身(Folder)或其他类(File)。 这可以通过源自相同基本接口的2个类在编程语言中实现。 这就是我更喜欢代表我的课程的方式:

public interface IBasicTreeItem
{
    string DisplayName { get; }
}

public class Folder : IBasicTreeItem
{
    public int Id { get; set; }
    public string DisplayName { get; set; }
    // This collection should be able to hold both Folder and File types
    public virtual ICollection<IBasicTreeItem> Children { get; set; }

    // Following 2 properties represent the parent folder
    // The file may not have a parent - in this case, it will be positioned in the root
    public int? FolderId { get; set; }
    public Folder ParentFolder { get; set; }
}

public class File : IBasicTreeItem
{
    public int Id { get; set; }
    public string DisplayName { get; set; }

    // Following 2 properties represent the parent folder
    // The file may not have a parent - in this case, it will be positioned in the root
    public int? FolderId { get; set; }
    public Folder ParentFolder { get; set; }
}

问题是这不适用于数据库,至少不是以这种直截了当的方式,而且我需要一些帮助才能弄清楚如何正确地构建我的类。

我尝试过的其他一些事情是首先创建数据库并从中生成C#对象(File表具有Folder表的外键,{{1}表也是如此} table to their) - 它导致了一些错误,但我可以看到它建议的基本思想 - Folder类中的两个集合,它可以容纳的每个子类型一个(这不是我的解决方案)希望因为我必须实现某种中间集合,这些集合必须将两个集合联合起来。)

1 个答案:

答案 0 :(得分:1)

您可以将Folder的文件和文件夹分成两个不同的集合 - 两个表,并实现Folder类的一些非映射属性,以返回已转换为IBasicTreeItem <的文件和文件夹/ p>

public interface IBasicTreeItem
{
    int Id { get; set; }
    string DisplayName { get; set; }
    int? FolderId { get; set; }        
}

public class BasicTreeItem : IBasicTreeItem 
{
    public int Id { get; set; }
    public string DisplayName { get; set; }
    public int? FolderId { get; set; }        
}

public class Folder : BasicTreeItem
{   
    public Folder ParentFolder { get; set; } 
    public virtual ICollection<Folder> Folders { get; set; }
    public virtual ICollection<File> Files { get; set; }

    [NotMapped]
    public ICollection<IBasicTreeItem> Content { get {
       return Files.Concat(Folders).Cast<IBasicTreeItem>();
    } }
}

public class File : BasicTreeItem
{
    public Folder ParentFolder { get; set; }
}