繁体   English   中英

ASP.NET & SQL Server:不会更新但会追加/插入

[英]ASP.NET & SQL Server: won't update but will append/insert

我正在使用带有自定义 html 帮助程序的数据库优先方法来使用 ajax 获取复选框的状态(在视图中不使用表单)。 我有两个表:

  • Tbl_1 -> Id、状态(真或假)、名称(复选框名称)
  • Tbl_2 -> Id, user_guid, 时间戳, Tbl_1Id (foreign_key)

当我执行插入操作时,它没有任何问题,但是当我尝试更新它时(基于登录用户,因为它也获得了 GUID,表被附加/插入了新数据)。

我的控制器:

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();
            }
        }
    }

谁能解释一下为什么它不更新而是使用新的 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();

我使用了错误的逻辑,即获取类的实例而不是“ent”对象。 谢谢你们的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM