【问题标题】:ASP.NET & SQL Server: won't update but will append/insertASP.NET & SQL Server:不会更新,但会追加/插入
【发布时间】:2017-01-26 23:16:29
【问题描述】:

我正在使用带有自定义 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 

没有任何帮助

【问题讨论】:

  • else 块应该是更新吗?您没有更新任何内容,您正在创建新记录并调用 .Add() 将它们添加到数据中。
  • 你得到的错误是什么?是数据库异常吗?您需要提供任何错误、堆栈跟踪来给您答案。
  • 是的,大卫,否则用于更新。你能解释一下我该如何解决它。
  • @Dhanuka777- 没有错误,只是不会更新,而是添加。
  • @rkun:你想更新什么?您有一个从数据中获得的cbs 对象,但您从不更新它。我不太清楚你要在这里修改什么。

标签: asp.net sql-server asp.net-mvc entity-framework ef-database-first


【解决方案1】:

你还没有为想要实现的逻辑编写代码..

我也不清楚 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();
}

【讨论】:

  • 部分正确的解决方案,因为他没有得到整个逻辑,但很好的启发。谢谢。
【解决方案2】:

在@David 和@Chetan 的帮助下解决了这个问题:

我按照 David 对代码进行了一些修改:

u.checkboxstate.state=cbstate.state;
u.checkboxstate.name=cbstate.name;
u.timestamp=DateTime.Now;
ent.saveChanges();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多