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