【问题标题】:Updating one record triggers changes of all the records for one of the same primary key in Entity Framework 6更新一条记录会触发 Entity Framework 6 中同一主键之一的所有记录的更改
【发布时间】:2017-04-08 00:50:29
【问题描述】:

我在我的 VS 项目中为本地数据库的实体框架使用了 ADO.NET 实体数据模型。只有一张表有两个复合主键(UserId、Data)和一个可修改字段(Status)。

问题是,当我尝试检索一条特定记录并修改其“状态”字段时,同一 UserId 的所有“状态”都会更改,而不管它们的 Data 值。 (但不同UserId下的记录不受影响。)更新代码如下:

public void updateStatus(string userId, string data, short status)
    using (var context = new MyDBContext()) {
        var data = context.UserDataStatus.Single(s => s.UserId == userId && s.Data == data);
        data.Status = status;
        context.UserImageStatus.Attach(data);
        context.Entry(data).Property(p => p.Status).IsModified = true;
        context.SaveChanges();
    }
}

我尝试了许多不同的方法来更新记录,例如使用.Where().FirstDefault()而不是Single()来检索记录,或者在我的context.UserDataStatus之后添加.AsNoTracking()。然而它也没有工作。

我发现有时实体框架无法正确处理重复/无主键,例如,我必须在查询中添加.AsNoTracking() 作为从同一数据库检索数据时的解决方法。我想知道是否是导致更新问题的相同原因,以及如何解决?

====

更新:

好吧,最后我发现问题是由于自动生成的 EF 模型只提供了 UserId 作为主键。即使我在 .edmx 中选择了“从数据库更新模型”,主键根本没有更新。于是我去.edmx模型浏览器,手动更新“数据”字段的属性,问题就解决了。而且我也不必再在查询中使用.AsNoTracking()

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    好吧,最后我发现问题是由于自动生成的 EF 模型只提供了 UserId 作为主键。尽管我在 .edmx 中选择了“从数据库更新模型”,但主键根本没有更新。于是我去.edmx模型浏览器,手动更新“数据”字段的属性(设置为主键),问题就解决了。而且我也不必再在查询中使用.AsNoTracking()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 2021-12-14
      • 1970-01-01
      • 2014-11-11
      • 2013-02-26
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多