在我的VS项目中,我使用ADO.NET实体数据模型作为本地DB的实体框架。只有一个表包含两个复合主键(UserId、Data)和一个可修改字段(Status)。
问题是,当我试图检索一个特定的记录并修改它的"Status“字段时,同一个UserId的所有"Status”都会改变,而不管它们的数据值。(但是,不同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模型浏览器,手动更新"Data“字段的属性,问题就解决了。我也不再需要在查询中使用.AsNoTracking()。
发布于 2017-04-08 09:14:22
好吧,最后我发现问题是因为自动生成的EF模型只给出了UserId作为主键。尽管我在.edmx中选择了“从数据库更新模型”,但主键根本没有更新。因此,我转到.edmx模型浏览器,手动更新"Data“字段的属性(将其设置为主键),问题就解决了。我也不再需要在查询中使用.AsNoTracking()。
https://stackoverflow.com/questions/43289023
复制相似问题