我有一个复杂的树结构,我正在尝试使用代码优先方法创建。
主要想法是一个有孩子们的集体。每个孩子可以使用同一类型的本身(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
类中的两个集合,它可以容纳的每个子类型一个(这不是我的解决方案)希望因为我必须实现某种中间集合,这些集合必须将两个集合联合起来。)
答案 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; }
}