【问题标题】:MVC-Entity framework- data not commited to databaseMVC-Entity 框架-数据未提交到数据库
【发布时间】:2015-10-12 00:48:52
【问题描述】:

我有以下代码在我的 MVC 程序中执行 CRUD 操作。

 if (ModelState.IsValid)
            {
                CustomerDal dal = new CustomerDal();

                dal.Customers.Add(obj);
                dal.Entry(obj).State = EntityState.Modified;//added this line to resolve issue but still no change
                dal.SaveChanges();
                return View("customer", obj);
            }
            else
            {
                return View("entercustomer",obj);
            }

还有我的客户班

   public class CustomerDal : DbContext
    {
        public CustomerDal(): base("CustomerDal")
    {
    }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Customer>().ToTable("tbCustomer");
        }
        public DbSet<Customer>Customers { get; set; }
    }
    }

客户类别

public class Customer : DropCreateDatabaseIfModelChanges<CustomerDal>
    {
        [Required]
        [RegularExpression("^[A-Z]{3,3}[0-9]{4,4}$")]
        [Key]
        public string CustomerCode { get; set; }
        [Required]
        [StringLength(10)]
        public string CustomerName { get; set; }

    }

程序运行时出现以下错误。

存储更新、插入或删除语句影响了意外 行数 (0)。实体可能已被修改或删除 实体已加载。看 http://go.microsoft.com/fwlink/?LinkId=472540 获取有关信息 理解和处理乐观并发异常。

表中不存在记录。这是一个新创建的表。 当我检查元素时,我可以看到我之前尝试过的所有项目都存在于上下文中,但未更新到数据库。当我添加以前没有尝试过的新项目时,不会发生并发错误。但数据不会更新到数据库中。

注意:我使用的是 MVC5

【问题讨论】:

  • dal.Entry(obj).State = EntityState.Modified; 这行不应该存在
  • @Ppp ,我在收到错误后添加了该行。

标签: asp.net-mvc entity-framework entity-framework-4 entity-framework-6 entity-framework-5


【解决方案1】:

我可以知道您的 CustomerDal 是什么吗?奇怪的是数据如何不更新到数据库。这是 Code First 应用程序吗?

我怀疑你没有包含连接字符串?

public class CustomerDal: DbContext
{
    public CustomerDal()
        : base("YourConnectionString")
    {
    }
    .....
}

【讨论】:

  • 我的 Dal 类和模型已更新。连接字符串已经包含在 dal 类中。
  • 没问题。删除这一行,dal.Entry(obj).State = EntityState.Modified;,因为这会导致该异常。重新运行看看是否仍然返回相同的异常?
  • 是的。当我删除并重新运行它时。感谢您的帮助。
【解决方案2】:

soo...我已经对并发异常进行了大量练习,那里有一些主要的错误原因:

1) 添加条目时,请确保您的模型构建器和您的数据库具有相同的自动增量值。如果 EF 具有自动增量,但 db 没有,则 EF 不会在插入语句中传递 Id 值,但会期望它从 DBMS 中返回。如果 EF 没有自动增量,但 db 有,它将在创建的语句中传递 ID,但 DBMS 不会期望它。您可以通过将数据库调用包装在事务中来超越这一点,从 IDENTITY INSERT 开始(确切的查询取决于您的提供者,但大多数都有这个)并以 Transaction.Commit(); 结束。

2) 修改条目时,确保 ID 值和所有乐观并发令牌都已存在于数据库中(在一行中)。否则 EF 将创建一个 UPDATE 语句,执行它,注意到没有行被影响,并抛出这个错误。

【讨论】:

  • 感谢您的建议。但我没有任何与你提到的相似的东西。表和模型构建器没有自动增量值。
  • 那么您是否提供了有效的 Id 值?
  • 是的。它经过验证并返回 true。
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 2012-12-15
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多