ASP.NET & SQL 服务器:不会更新但会 append/insert
ASP.NET & SQL Server: won't update but will append/insert
我正在使用数据库优先方法和自定义 html 帮助器来使用 ajax 获取复选框的状态(不在视图中使用表单)。我有两个 tables:
- Tbl_1 -> Id, state (true or false), name (复选框名称)
- Tbl_2 -> ID,user_guid,时间戳,Tbl_1Id (foreign_key)
当我执行插入操作时,它没有任何问题,但是当我尝试更新它时(基于登录用户,因为它也获得了 GUID,table 得到 appended/inserted 新的数据)。
我的控制器:
public ActionResult SetState(checkboxstate cbstate)
{
var UserId = new Guid(System.Security.Claims.ClaimsPrincipal.Current.FindFirst("sub").Value);
var ent = new StartopDatabaseEntities();
var cbs = ent.checkboxstates.Where(w => w.Name == "World").FirstOrDefault();
if (cbs == null) // when there are no records in the database
{
ent.checkboxstates.Add(cbstate);
ent.checkboxstateUpdates.SingleOrDefault(c => c.Id == cbstate.Id);
var cbsOp = new checkboxstateUpdates();
cbsOp.timestamp = DateTime.Now;
cbsOp.user_guid = UserId;
cbstate.checkboxstateUpdates.Add(cbsOp);
ent.SaveChanges();
} // record in database, update (I've only one user now, so has to update only this one)
else
{
var cbsOp = new checkboxstateUpdates(); // declare in global
var chc = new checkboxstate(); // to be declared in global
var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).ToList();
foreach (var u in newCbs)
{
if(u.user_guid==UserId && u.CheckboxStateId == u.checkboxstate.Id)
{
chc.state = cbstate.state;
chc.name = cbstate.name;
ent.checkboxstates.Add(chc);
cbsOp.Tidspunkt = DateTime.Now;
cbsOp.OpdateretAfBruger = UserId;
ent.checkboxstateUpdates.Add(cbsOp);
ent.SaveChanges();
}
}
}
任何人都可以解释为什么它没有更新但 appending/inserting 具有新 ID(主键)的相同数据?我有一个简单的视图,其中 Ajax 使用复选框的状态和名称向控制器发送调用。我也试过
Db.Entry(obj).state = EntityState.Modified
没有任何帮助
你没有写代码实现的逻辑..
我也不清楚 if 块的逻辑,但 else 部分可以修复如下。
var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).Where(u.user_guid == UserId).FirstOrDefault();
if(newCbs != null) {
newCbs.checkboxstate.state = cbstate.state;
newCbs.checkboxstate.name = cbstate.name;
newCbs.Tidspunkt = DateTime.Now;
newCbs.OpdateretAfBruger = UserId;
ent.SaveChanges();
}
在@David 和@Chetan 的帮助下解决了这个问题:
我按照 David 对代码做了一些修改:
u.checkboxstate.state=cbstate.state;
u.checkboxstate.name=cbstate.name;
u.timestamp=DateTime.Now;
ent.saveChanges();
我使用了错误的逻辑,即获取 class 而不是 'ent' 对象的实例。谢谢大家的帮助。
我正在使用数据库优先方法和自定义 html 帮助器来使用 ajax 获取复选框的状态(不在视图中使用表单)。我有两个 tables:
- Tbl_1 -> Id, state (true or false), name (复选框名称)
- Tbl_2 -> ID,user_guid,时间戳,Tbl_1Id (foreign_key)
当我执行插入操作时,它没有任何问题,但是当我尝试更新它时(基于登录用户,因为它也获得了 GUID,table 得到 appended/inserted 新的数据)。
我的控制器:
public ActionResult SetState(checkboxstate cbstate)
{
var UserId = new Guid(System.Security.Claims.ClaimsPrincipal.Current.FindFirst("sub").Value);
var ent = new StartopDatabaseEntities();
var cbs = ent.checkboxstates.Where(w => w.Name == "World").FirstOrDefault();
if (cbs == null) // when there are no records in the database
{
ent.checkboxstates.Add(cbstate);
ent.checkboxstateUpdates.SingleOrDefault(c => c.Id == cbstate.Id);
var cbsOp = new checkboxstateUpdates();
cbsOp.timestamp = DateTime.Now;
cbsOp.user_guid = UserId;
cbstate.checkboxstateUpdates.Add(cbsOp);
ent.SaveChanges();
} // record in database, update (I've only one user now, so has to update only this one)
else
{
var cbsOp = new checkboxstateUpdates(); // declare in global
var chc = new checkboxstate(); // to be declared in global
var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).ToList();
foreach (var u in newCbs)
{
if(u.user_guid==UserId && u.CheckboxStateId == u.checkboxstate.Id)
{
chc.state = cbstate.state;
chc.name = cbstate.name;
ent.checkboxstates.Add(chc);
cbsOp.Tidspunkt = DateTime.Now;
cbsOp.OpdateretAfBruger = UserId;
ent.checkboxstateUpdates.Add(cbsOp);
ent.SaveChanges();
}
}
}
任何人都可以解释为什么它没有更新但 appending/inserting 具有新 ID(主键)的相同数据?我有一个简单的视图,其中 Ajax 使用复选框的状态和名称向控制器发送调用。我也试过
Db.Entry(obj).state = EntityState.Modified
没有任何帮助
你没有写代码实现的逻辑..
我也不清楚 if 块的逻辑,但 else 部分可以修复如下。
var newCbs = ent.checkboxstateUpdates.Include(c => c.checkboxstate).Where(u.user_guid == UserId).FirstOrDefault();
if(newCbs != null) {
newCbs.checkboxstate.state = cbstate.state;
newCbs.checkboxstate.name = cbstate.name;
newCbs.Tidspunkt = DateTime.Now;
newCbs.OpdateretAfBruger = UserId;
ent.SaveChanges();
}
在@David 和@Chetan 的帮助下解决了这个问题:
我按照 David 对代码做了一些修改:
u.checkboxstate.state=cbstate.state;
u.checkboxstate.name=cbstate.name;
u.timestamp=DateTime.Now;
ent.saveChanges();
我使用了错误的逻辑,即获取 class 而不是 'ent' 对象的实例。谢谢大家的帮助。