【问题标题】:Proper way to update the list of records in table using entity framework使用实体框架更新表中记录列表的正确方法
【发布时间】:2019-12-15 03:08:38
【问题描述】:

在我的教育计划数据库表中,我有一个特定学生的 3 条记录

所以我想从这个人列表中删除 P3 程序,所以在字体结束时它的显示就像这样

一旦我点击删除,特定的 P3 从前端和模型中删除,一旦点击 save 按钮,它就会传递到后端代码 P1,P2 作为列表。

我正在使用实体框架进行数据库事务。

在这里寻找您的建议

  • 我是否应该删除所有现有记录,然后再次插入 P1P2。 或者
  • 我是否需要通过比较我发送的列表与现有记录来迭代每条记录并附加 P1P2 并找出丢失的一条并删除 或者
  • 这种类型的事务可以EF自己做

期待推荐哪种方式

【问题讨论】:

  • 选择选项 1 可能有点脆弱。选项 2 听起来不错,但选项 1 和 2 的共同点是您需要查询数据库一次才能发送列表到视图,然后第二次从数据库中获取列表以比较差异,然后第三次删除和更新可能已更改的任何项目。这对数据库造成了很大的打击。您可能会想出一个解决方案,其中使用 deletededited 标志,您可以将其用于 Update()Remove() 已编辑/已删除的行。

标签: c# sql-server asp.net-mvc entity-framework linq


【解决方案1】:

我建议您选择第二种选择,因为它是删除丢失记录而不是删除所有记录的更好方法。

集合中的“缺失”项不被视为已删除。

因此,您需要自己标记要删除的项目。像这样的:

public void Update(Programme record)
{
    var missingRows = dB.ProgrammeRows.Where(i => i.ProgrammeId == record.ProgrammeId)
                        .Except(record.Rows);
    dB.ProgrammeRows.RemoveRange(missingRows);

    dB.Programmes.Update(record);
    dB.SaveChanges();
}

并且类应该如下:

   public class ProgrammeRow
   {
        public int ProgrammeId { get; set; }
        public string ProgrammeName { get; set; }
        public int StudentId { get; set; }
        public virtual Student Student{ get; set; }
   }

   public class Programme
   {
        public int ProgrammeId { get; set; }
        private ICollection<ProgrammeRow> _rows;
        public virtual ICollection<ProgrammeRow> Rows => _rows ?? (_rows = new List<ProgrammeRow>());
   }

【讨论】:

  • 非常感谢 Vignesh 让我先申请并通知您
  • 据我所见,这似乎是一种非常常见的方法。在我工作过的每一个地方,都采取了这种方法来实现这种事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多