C# 为什么要使用这个可查询的修改(更新)数据库?
使用此变量时,我遇到以下错误: 附加类型为“”的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 这迫使我从:C# 为什么要使用这个可查询的修改(更新)数据库?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,使用此变量时,我遇到以下错误: 附加类型为“”的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 这迫使我从: db.Entry(model.sub.State=EntitySt
db.Entry(model.sub.State=EntityState.Modified;to:EntityState.Added(创建新的Db条目,我不需要它) 守则:
{
var loggedInUserId = User.Identity.GetUserId();
var member = await db.member.SingleOrDefaultAsync(m => m.ApplicationUserId == loggedInUserId);
//check if the subject name already exists.
var match = await db.Subject.Select(s => s.SubjectName).FirstOrDefaultAsync(subjectName => subjectName.Equals(model.sub.SubjectName));
model.rev.Created = DateTime.Now;
if (!ModelState.IsValid)
{
return View(model);
}
bool comper = string.Equals(model.sub.SubjectName, match, StringComparison.InvariantCultureIgnoreCase);
if (comper == true)
{
var getSubject = (from c in db.Subject.Where(aa => aa.SubjectName.ToString().ToLower().Equals(match)) select c);
var GetSubjectId = await (from a in getSubject select a.SubjectId).SingleAsync();
var R_getvelue = await getSubject.SingleAsync();
if (model.rev.GBU == "Good")
{
//Error
var Good = R_getvelue.Good;
var Bad = R_getvelue.Bad;
var Ugly = R_getvelue.Ugly;
//OK
//var Good = await (from a in getSubject select a.Good).SingleAsync();
//var Bad = await (from b in getSubject select b.Bad).SingleAsync();
//var Ugly = await (from u in getSubject select u.Ugly).SingleAsync();
model.sub.Bad = Bad;
model.sub.Ugly = Ugly;
int iGoodRating = Convert.ToInt32(Good);
iGoodRating++;
model.sub.Good = iGoodRating;
model.sub.SubjectId = GetSubjectId;
model.sub.Total = Convert.ToInt32(model.sub.Ugly + model.sub.Bad + model.sub.Good);
db.Entry(model.sub).State = EntityState.Added
}
您是否在视图模型/视图中使用DB实体?我强烈建议不要这样做,并手动从DB加载实体,而不是为此使用更改跟踪器。这段代码很快就变得难以控制和维护。我很乐意接受建议,你有什么建议?我认为,在这里要做的第一件事是摆脱ViewModel中的DB模型,完全独立使用ViewModels,即使是你在这里编辑的
模型。然后,在您的方法中,您应该按Id从数据库中加载当前的模型
,该Id取自用于编辑它的ViewModel,并手动从ViewModel的属性更新DB model中的属性。我不确定我是否理解,您是否可以将整个方法体包含在名称中,参数+在您的帖子中定义模型的类型,以便我可以在您的代码中显示它?