这个oops设计好吗?

时间:2014-01-03 05:50:17

标签: c# asp.net-mvc

我正在开发一个Asp.Net MVC-5项目,使用代码优先的方法进行数据库设计。我对我的代码设计有疑问。

我的数据库架构名称中有一个实体学生

public partial class Student
{
  public int Id { get; set; }
  public string RollNumber { get; set; }
  public string Name { get; set; }
  public string Address { get; set; }
  public string Mobile { get; set; }
  public string Email { get; set; }
}

请注意,我已将此声明为部分,因为我将其扩展并包含学生的所有功能处理。像这样:

public partial class Student
{
   [NotMapped]
   private MyDbContext context = new MyDbContext();

   public static Student Get(int id)
   {
     Student student;
     using(MyDbContext context = new MyDbContext())
     {
       student = context.Students.SingleOrDefault(s => s.Id == id)
     }
     return student;
   }

   public void Student Create()
   {
     context.Students.Add(this);
     context.SaveChanges();
   }

   ....
   and similarly many other
}

请注意,我已经声明了一个静态Get函数,它接受id并返回它存在的Student对象,否则为null。我已经声明这是静态的,因为它已经返回一个Student对象,所以用对象调用它对我来说似乎是不合理的(如果我错了请纠正我)。

要注意的第二件事是 NotMapped 属性,我在运行迁移时用于将此属性排除在映射到数据库之外。

所以我使用上述设计与我的所有实体(即将数据包装数据和函数处理成单个对象)。我想知道这种设计方法是好的还是存在其他更好的方法还是我走错路?

3 个答案:

答案 0 :(得分:1)

在我看来,没有正确或错误的设计。然而,您已经认识到需要通过使用相同分部类的两个不同文件来保持实体和检索访问不同。我会在不同的模块中将它们完全分开。

我强烈建议您使用repository patternHere您可以找到有关如何实施该指南并将其与unit of work模式相结合的指南。

在简短版本中,存储库是处理特定实体类型的数据访问操作的类。

希望我帮忙!

答案 1 :(得分:0)

您不需要NotMapped属性,因为上下文是私有字段,而不是属性。至于在类中使用Get,Create等方法,这就是所谓的Active Record模式,它只是个人偏好的问题。

答案 2 :(得分:0)

您应该尝试 ASP.NET Scaffolding