Entity framework 如何替换实体对象上的现有集合

Entity framework 如何替换实体对象上的现有集合,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,假设我创建了一个新实体,并将其保存为: UserReport report = new UserReport() {//set the props} manager.SaveUserReport(report) Public UserReport SaveUserReport(UserReport report) { using(var context = new ReportDatabase()) { context.UserReports.AdObject(report);

假设我创建了一个新实体,并将其保存为:

UserReport report = new UserReport() {//set the props}
manager.SaveUserReport(report)

Public UserReport SaveUserReport(UserReport report)
{
  using(var context = new ReportDatabase())
  {
    context.UserReports.AdObject(report);
    context.SaveChanges();
  }
  return report;
}
到目前为止还不错

然后我读回保存的报告

 savedReport = manager.GetUserReports(new int[] {report.Id}).FirstOrDefault();

 Public List<UserReport> GetUserReports(IEnumerable<int> reportIds)
 {
     using (var context = new ReportDatabase())
     {
        var reports = from UserReport in context.UserReports
          where reportIds.Contains(userReport.Id)
          select userReport;
          return visibleReports.ToList();
     }
 }
此操作失败,错误为“无法设置UserReport_etc”类型上的“属性列”,因为集合已设置为EntityCollection”

我已经看过了:问题是一样的,但我不能使用这个解决方案


解决这个问题的正确方法是什么?

好的-看起来这只是将非导航属性设置为非虚拟的一种情况


这是一个非常奇怪的情况,因为被修改的行为是保留为虚拟的属性。

什么是“Columns”属性类型?如何获取“new ColumnCollection”以及它的类型是什么?我真的不想创建可以设置集合的条件。代码没有解释它的意图,这样以后可能会有人决定再次将属性虚拟化。相反,我总是通过
Add
Remove
来修改
EntityCollections
。非常清楚。我不明白为什么我会被迫使用POCO。如果这是一个记录在案的限制,那会有所不同,但事实并非如此't-这只是留给你自己去发现的东西。没有理由说你可以只设置一次集合,但永远不要修改它-除非通过添加或删除-以保持一致。集合应该在构造函数中创建,所以你只能使用添加或删除。我改为使用DbContext生成器,而不是POCO生成器-这将创建实体,允许上述开箱即用,因此不再需要手动修改代码。
 savedReport.Columns = newColumnCollection