用于"Home Folder"的 C# 数据结构 - 这应该是它自己的实体吗?



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

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)使用这个实体,只是添加"isHomeFolder"作为一个属性。这很简单,但意味着我将通过网络为JSON请求发送空白[Required]属性——主文件夹没有标题,不能存档,等等。

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

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

如果它很重要,我正在构建实体框架代码优先+ WebAPI。

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

至于必填字段为空-只需使用一些默认值,服务器端不会解析,你就可以了;)

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

这就是为什么ViewModel是重要的,以避免不必要的(过度)张贴,张贴你不需要的值。此外,避免在实体中出现不需要的必填字段,或者它们不适用于"特定视图"。一个实体不一定要转换成一个视图。你的情况就是一个活生生的例子。

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

正如我所提到的,创建一个视图模型并只复制需要捕获输入的属性。即使在相同的属性上添加了数据注释,这也不是重复。视图模型上的数据注释是用于视图验证的。实体上的注释用于域验证。在我看来,这并不是重复,因为你的UI与你的域是不同的层次。

也许你应该创建一个包含常见属性的类。然后,您可以使用两个实现从第一个继承的类。

相关内容

最新更新