更新一条记录会触发实体框架6中同一主键之一的所有记录的更改

时间:2017-04-08 00:50:30

标签: c# entity-framework

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

问题是,当我尝试检索一个特定记录并修改其状态"状态"领域,所有"状态"对于相同的UserId更改,无论其数据值如何。 (但不同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(),或者在.AsNoTracking()之后添加context.UserDataStatus。但它也没有用。

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

====

更新:

好吧,最后我发现问题是由于自动生成的EF模型仅将UserId作为主键引起的。即使我选择了#34;从数据库更新模型"在.edmx中,主键根本没有更新。所以我去了.edmx模型浏览器,手动更新了" Data"领域,问题解决了。我也不必在查询中使用.AsNoTracking()

1 个答案:

答案 0 :(得分:1)

好吧,最后我发现问题是由于自动生成的EF模型仅将UserId作为主键引起的。即使我选择了#34;从数据库更新模型"在.edmx中,主键根本没有更新。所以我去了.edmx模型浏览器,手动更新了" Data"字段(将其设置为主键),问题解决了。我也不必在查询中使用.AsNoTracking()