2017-07-26 104 views
0

我有一个名为GetAll()的方法在服务类中从实体框架返回实体。该方法如下:修改实体而不跟踪它

public ActionResult List() 
     { 
     var tasklogs = _timeLogService.GetAll() 
      .Select(l=>{ 
       l.StartTime.Value.AddHours(1); 
       return l; 
      }); 

     return PartialView(tasklogs); 

     } 

我想在改性按照一些逻辑视图以显示数据,在本例中,我1小时添加到原来的日期。

问题是,如果我刷新页面,我会看到每个页面刷新的小时数增加,即GetAll()方法返回最后修改后的值,尽管它在数据库中不一样,即我不保存日期修改数据库,但GetAll返回修改日期。

我在某处读到这个工作,我需要分离实体。

所以,我的问题是,是否有更好的方法在服务层做到这一点,因为我必须在很多地方做到这一点。修改日期的根本原因是我使用db保存UTC中的日期,但是当我将它显示在视图中时,我将它转换为控制器操作中的本地时区。

我希望我说清楚。

感谢

+1

一种解决方案是不直接在视图中使用EF实体。正是出于这个原因,你应该尽量让你的viewmodel类与数据访问类分开。但是,如果你必须这样做,使用'AsNoTracking',只是非常小心你的数据。 –

+3

虽然这听起来不像“追踪”问题。您的代码不会将更新的数据保存在我可以看到的任何地方。很可能你会保留'DbContext'的单个实例,这会保持所有的实体加载,并且是一种反模式。对于每个执行的逻辑数据操作,您应该有一个'DbContext'的新实例。这通常意味着每个“ActionMethod”都有一个新的实例。 –

+0

@BradleyUffner你是对的,我有单一的DbContext实例,因此也是这个问题。它在我根据请求更改为实例后解决。 –

回答

0

写在我的评论,问题是每个请求后,我改变的DbContext实例创建来解决。