C# C“的数据结构”;主文件夹";-这应该是它自己的实体吗?

C# C“的数据结构”;主文件夹";-这应该是它自己的实体吗?,c#,.net,entity-framework,asp.net-mvc-4,asp.net-web-api,C#,.net,Entity Framework,Asp.net Mvc 4,Asp.net Web Api,在我的应用程序中,我有可以包含其他文件夹的文件夹。它们具有如下各种属性: public class Folder { public Folder() { Sets = new Collection<Set>(); Folders = new Collection<Folder>(); Stage = Stage.one; IsArchiv

在我的应用程序中,我有可以包含其他文件夹的文件夹。它们具有如下各种属性:

public class Folder
    {
        public Folder()
        {
            Sets = new Collection<Set>();
            Folders = new Collection<Folder>();
            Stage = Stage.one;
            IsArchived = false;
            DateCreated = DateTime.Now;
            }

        // Primitive Properties 

        [Required]
        [Key]
        public virtual int FolderId { get; set; }

        public virtual int? ParentFolderId { get; set; }

        [ForeignKey("ParentFolderId")]
        public virtual Folder ParentFolder { get; set; }

        [Required]
        public int UserId { get; set; }

        [Required]
        public virtual string Title { get; set; }

        public virtual string Details { get; set; }

        [Required]
        public virtual Stage Stage { get; set; }

        [Required]
        public virtual bool IsArchived { get; set; }

        [Required]
        public virtual DateTime DateCreated { get; set; }

        [ForeignKey("FolderId")]
        public virtual ICollection<Set> Sets { get; set; }

        [ForeignKey("ParentFolderId")]
        public virtual ICollection<Folder> Folders { get; set; }

    }
公共类文件夹
{
公用文件夹()
{
集合=新集合();
文件夹=新集合();
阶段=阶段1;
IsArchived=错误;
DateCreated=DateTime.Now;
}
//原始属性
[必需]
[关键]
公共虚拟整数FolderId{get;set;}
公共虚拟int?ParentFolderId{get;set;}
[ForeignKey(“ParentFolderId”)]
公共虚拟文件夹父文件夹{get;set;}
[必需]
public int UserId{get;set;}
[必需]
公共虚拟字符串标题{get;set;}
公共虚拟字符串详细信息{get;set;}
[必需]
公共虚拟阶段{get;set;}
[必需]
公共虚拟布尔值已存档{get;set;}
[必需]
公共虚拟日期时间DateCreated{get;set;}
[外键(“FolderId”)]
公共虚拟ICollection集{get;set;}
[ForeignKey(“ParentFolderId”)]
公共虚拟ICollection文件夹{get;set;}
}
现在,应用程序的每个用户都有一个“主文件夹”——一个起点。但是,主文件夹不需要上述属性的一半。我想我有两个选择:

1) 使用此实体,只需添加“isHomeFolder”作为属性。这很简单,但意味着我将通过网络发送JSON请求的空白[必需]属性-主文件夹没有标题,无法存档,等等

2) 创建另一个仅包含必需字段的实体,并在其中复制必需的属性。这看起来不是很干,但感觉比第一个选择好

作为一个初学者程序员,我不确定是否还有其他选择。这里有标准的方法/解决方案吗

如果有必要,我将首先构建实体框架代码+WebAPI

2) 创建另一个仅包含所需字段的实体并复制 所需的属性在那里。这看起来不是很干,但是 感觉比第一个选择好

这就是为什么ViewModel对于避免不必要的(过度)过账非常重要的原因,过账的值是您不需要的。此外,为了避免实体中的必填字段出现在您不需要的地方,或者它们不适用于“特定视图”。实体不一定转换为单个视图。你的案子就是一个活生生的例子

这里有标准的方法/解决方案吗


正如我所提到的,创建一个viewmodel并只复制您需要为其捕获输入的属性。这并不是重复您自己,即使您在相同的属性上放置了DataAnnotation。viewmodel上的数据注释用于视图验证。实体上的注释用于域验证。在我看来,这并不重复,因为您的UI与您的域是不同的层。

也许您应该创建一个包含公共属性的类。然后您可以使用两个类来实现第一个类的继承

这取决于与文件夹总数相比,您将拥有多少主文件夹。如果您将拥有比主文件夹多得多的二级文件夹(而且您很可能会),那么为什么要为了10%或20%的请求而麻烦实现另一种结构呢

对于必填字段为空的情况,只需使用一些默认值,这些值在服务器端不会被解析,这很好;)