代码优先 - 我觉得我错过了重点

时间:2012-11-19 08:07:37

标签: asp.net-mvc ef-code-first code-first

所以要把事情放在眼里:

到目前为止,我已经有了使用Entity Framework edmx模型的一些经验。该过程(分层)将总结为:

  • 创建数据库,在edmx文件中生成一层对象
  • 有一层业务对象(我不确定业务是否正确)是从edmx对象初始化的(只有业务对象在我的应用程序中使用)
  • 在MVC站点中,在需要的地方有一层视图模型对象(无论何时直接从我的业务对象生成视图都不起作用)

我的印象是,使用Code First,数据库层对象(以前称为edmx对象)和业务层对象是同一个,实际上是跳过一个层。那是一位比我更多经验的同事告诉我的。

问题在于我认为这不太适用。代码的局限性首先像标量键,在对象内部具有导航属性,无法在没有变通方法的情况下映射数据库中的私有字段,并且在某种程度上被强制使用autoproperties,我觉得我搞乱了我的业务对象。

快速示例: 我有以下实体:

  • 团队:TeamId和Description(后端,FrontEnd等)
  • 组:GroupId和说明(开发人员,团队负责人,PM等)
  • 状态:具有团队和组的对象,不能保留在数据库中
  • 用户:UserId,FirstName,LastName
  • 员工:也是团队和组的一部分的用户(其中​​包含用户属性和状态属性)

Users表将被非规范化,因为它将包含我的User类具有的所有信息,但也有一个TeamId和GroupId,只有在User也是Employee时才会填充它。所以基本上Employee和User映射到同一个表

这会导致一些奇怪的解决方法,因为例如在Employee类中我需要将UserId作为主键公开,而不是通过User属性的UserId(因为键需要是标量)来获取它,这是丑陋的;另外,即使我在Employee类中有一个Status属性,我仍然需要有2个额外的属性(TeamId和GroupId,从Status属性Team和Group获得),以便拥有组和团队的标量外键,很麻烦,感觉很乱。在Group / Team类中添加用于导航目的的虚拟IList似乎也是不必要的(尽管从我所看到的可以跳过它)。同样只有对象的自动属性似乎是错误的,我希望由ctor实例化私有,并且只为它们提供getter。

我没有得到它吗?即使在首先使用代码时,我仍然需要附加层吗?我的模特从一开始搞砸了吗?抱歉,我无法为您提供代码,但此刻我不在家,代码块似乎非常狡猾:D

1 个答案:

答案 0 :(得分:0)

我倾向于在存储库和服务模式中工作。在我的经历中,我总是发现更容易巩固我的应用程序将要使用的(模型)以及它们将如何存储(结构)。我倾向于使用所有链接和FK构建数据库,构建EF模型(EDMX),然后在其上添加一个层作为服务/回购层。这样,您的应用程序总是只引用Service / Repo层,如果您的EDMX中断或者您必须更改某些东西调用EDMX的方式,您只需要在一个位置修复它。最近我一直在混合使用与服务类混合的IRepository模式,它似乎很好地融合并且易于使用。希望这能为你澄清一些,祝你好运!