【发布时间】: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