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

时间:2013-04-16 02:30:47

标签: 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;
            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请求发送空白[必需]属性 - 主文件夹没有标题,无法存档等。

2)创建仅包含必填字段的另一个实体,并在那里复制所需的属性。这似乎不是很干,但感觉比第一个选项更好。

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

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

3 个答案:

答案 0 :(得分:0)

  

2)创建另一个只包含必填字段且重复的实体   那里所需的属性。这似乎不是很干,但是   感觉比第一种选择更好。

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

  

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

正如我所提到的,创建一个viewmodel并仅复制捕获输入所需的属性。即使您将数据注释放在相同的属性上,也不会重复自己。您的viewmodel上的数据注释用于视图验证。您实体的注释适用于域验证。这不是重复,IMO,因为您的UI与您的域不同。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这取决于您将要使用的文件夹总数与文件夹总数相比。如果你要拥有比家庭文件夹更多的二级文件夹(并且你很可能会这样做),那么为什么只是为了10%或20%或请求而打扰实现另一个结构。

至于必填字段为空 - 只需使用一些默认值,这些默认值不会在服务器端解析,而且你很好;)。