2017-01-10 40 views
0

“属性或索引不能被分配到 - 它是只读”更新数据库记录,只有当阅读

我看到很多类似的问题,虽然似乎没有真正帮助我。

我正在更新我的数据库中的一些行。

首先,我打电话给我的数据:

var projects = (from p in _ProjectRep.GetAll() 
         join cl in _ClientRepo.GetAll() on p.ClientID equals cl.ClientID 
         where p.IsOpen == true && p.Tasks.Any(t => t.TimeEntries.Any(te => te.DateEntity >= dateLimit)) == false && p.Tasks.Any(te => te.TimeEntries.Any()) 
         select new { 
          TickProjectID = p.TickProjectID, 
          ClientName = cl.ClientName, 
          ProjectName = p.ProjectName, 
          IsOpen = p.IsOpen, 
          DateClosed = p.DateClosed 
         }).ToList(); 

然后我通过数据尽量循环,并更新这些记录的特定字段。

foreach (var item in projects) 
     {// Update projects to closed. 
      item.IsOpen = false; 
      item.DateClosed = DateTime.Now; 
     } 

,最后保存数据..

// updates changes to OUR db. 
    var affectedCount = _UnitOfWork.SaveChanges(); 

但我不断收到这个错误,我不知道该怎么办才好。 我能读的是关于get/set的东西,但我没有这些, ,我不明白为什么这些应该是nessesary?

希望有人能给出一个明确的解决方案,这可能会帮助我。

编辑

private readonly ProjectRepository _ProjectRep; 

_ProjectRep = new ProjectRepository(unitOfWork); 
+0

是否可以包含'_ProjectRep'类的定义 –

+0

@非幸运添加了我称之为的地方,那是你的意思? – andrelange91

+0

'_ProjectRep'被定义为只读,所以它不会允许你更新 –

回答

1
var projects = (from p in _ProjectRep.GetAll() 
        join cl in _ClientRepo.GetAll() on p.ClientID equals cl.ClientID 
        where p.IsOpen == true && p.Tasks.Any(t => t.TimeEntries.Any(te => te.DateEntity >= dateLimit)) == false && p.Tasks.Any(te => te.TimeEntries.Any()) 
        select p).ToList(); 

试试这个。你的代码中的问题是,你正在使用匿名类型(使用新的{...}创建)。此类型不知道更改跟踪等任何内容,它的属性是只读的,所以此类型不能用于保存对数据库的更改。

+0

这确实也是我发现的。虽然不是只是p,我添加了一个新的Project = p,ClientName = cl.Clientname,因为我也需要这些信息。 – andrelange91

0

看来我的SQL调用是匿名的,因此它不知道它是什么。

我改变了我的SQL调用选择

var projects = (from p in _ProjectRep.GetAll() 
         join cl in _ClientRepo.GetAll() on p.ClientID equals cl.ClientID 
         where p.IsOpen == true && p.Tasks.Any(t => t.TimeEntries.Any(te => te.DateEntity >= dateLimit)) == false && p.Tasks.Any(te => te.TimeEntries.Any()) 
         select new { 
          Project = p, 
          ClientName = cl.ClientName 

         }).ToList(); 

,然后我只需要调用“项目。{}的东西”时,我想选择的数据。

这样的:

foreach (var item in projects) 
     {// Update projects to closed. 
      item.Project.IsOpen = false; 
      item.Project.DateClosed = DateTime.Now; 
     } 

这让整个事情的工作。