更新数据库记录时只读

时间:2017-01-10 07:35:00

标签: c# sql-update

"无法分配属性或索引器 - 它是只读的"

我看到很多类似的问题,但实际上似乎没有人帮助我。

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

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

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(); 

但我一直得到这个错误,我不知道该怎么办。 我能读到的是关于获取/设置的东西,但我没有这些, 我不明白为什么那些应该是必须的?

希望有人可以提供明确的解决方案,这可能会对我有所帮助。

修改

private readonly ProjectRepository _ProjectRep;

_ProjectRep = new ProjectRepository(unitOfWork);

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分: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();

然后当我想选择数据时,我只需要调用“Project。{something}”。

像这样:

foreach (var item in projects)
        {// Update projects to closed.
            item.Project.IsOpen = false;
            item.Project.DateClosed = DateTime.Now;
        }
这使整个事情发挥作用。