我有以下代码在我的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
答案 0 :(得分:1)
soo ...我对并发异常进行了大量的练习,其中有一些主要的错误原因:
1)添加条目时,请确保您的模型构建器和数据库具有相同的自动增量值。如果EF有自动增量,但db没有,EF不会在insert语句中传递Id值,但是会从DBMS返回。如果EF没有自动增量,但db有,它将在创建的语句中传递ID,但DBMS不会期望它。你可以通过在事务中包装数据库调用来超越这个,从IDENTITY INSERT开始(确切的查询取决于你的提供者,但大多数都有这个)并以Transaction.Commit();结束。
2)修改条目时,请确保ID值和所有乐观并发标记已存在于数据库中(在一行中)。否则,EF将创建一个UPDATE语句,执行它,注意没有行受影响,并抛出此错误。
答案 1 :(得分:1)
我可以知道您的CustomerDal是什么吗?很奇怪数据如何不更新到数据库。这是Code First应用程序吗?
我怀疑你没有包含连接字符串?
public class CustomerDal: DbContext
{
public CustomerDal()
: base("YourConnectionString")
{
}
.....
}