2013-04-28 57 views
0

当我基于VS2012单页MVC Web应用程序生成项目时,基础项目包含大量对DbEntity的引用。为什么使用实体框架的DbEntity?

为什么:

db.Entry(todoList).Entity.UserId 

,而不仅仅是:

todoList.UserId 

它一再使用这种间接的样品ApiControllers,但只有一次调用DbEntityEntry特定成员(State属性)。是否有一些重要的原因使用我忽略的原因?

编辑:这是一个较大的片段

// DELETE api/TodoList/5 
[ValidateHttpAntiForgeryToken] 
public HttpResponseMessage DeleteTodoList(int id) { 
    TodoList todoList = db.TodoLists.Find(id); 
    if (todoList == null) { 
     return Request.CreateResponse(HttpStatusCode.NotFound); 
    } 

    if (db.Entry(todoList).Entity.UserId != User.Identity.Name) { 
     // Trying to delete a record that does not belong to the user 
     return Request.CreateResponse(HttpStatusCode.Unauthorized); 
    } 
+2

看起来像新手冗余或模式有人偏执分离实体将采取普遍。 – millimoose 2013-04-28 09:25:55

+0

谢谢毫毛。是的,一个独立的实体更有意义。在这个示例中不可能发生,但是我可以看到,如果我正在忙于控制实现原始实体而不是DTO或ViewModel的控制器操作,那么这会比没有实体的实体更容易潜入我的身体。 :)(阅读为:“如果我是一个懒鬼,我可以看到这会是一个问题”) – shannon 2013-04-28 09:37:13

回答

2

我相信它的存在,让你确保你引用数据库实体,不只是一个实例(模型类的),可能在数据库中不存在。

+0

由于通过'db.TodoLists.Find()'检索了对象,这似乎毫无意义。 – millimoose 2013-04-28 09:25:32

+0

那么这只是一些程序员在构建样本时练习语义预防?在我看来,由于示例中的数据库上下文位于实例上,因此即使Find(id)也无法从内存中返回任何内容。 – shannon 2013-04-28 09:26:17

+0

是的,Find()可以返回一个未被执行的实体,但即使它可以(假设我从样本中修改了DbContext的范围),那么我希望它在这个代码示例中被删除。 – shannon 2013-04-28 09:27:34