实体框架 6 不保存更改

Posted

技术标签:

【中文标题】实体框架 6 不保存更改【英文标题】:Entity Framework 6 not saving changes 【发布时间】:2017-12-10 00:35:04 【问题描述】:

我有一个 MVC5 Web 应用程序,它使用 SQL Server 2008 作为后端数据库以及 Entity Framework 6。添加代码没有错误,但数据无法存储到数据库中。

我的模型 context.cs 看起来像

public partial class checkin_checkoutEntities2 : DbContext
    
        public checkin_checkoutEntities2()
            : base("name=checkin_checkoutEntities2")
        
        
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        
            throw new UnintentionalCodeFirstException();
        
    
        public virtual DbSet<Advance_Booking> Advance_Bookings  get; set; 
        public virtual DbSet<employee_reg> employee_reg  get; set; 
        public virtual DbSet<Extend_Stay> Extend_Stay  get; set; 
        public virtual DbSet<Guest_reg> Guest_reg  get; set; 
        public virtual DbSet<RoomBooking> RoomBooking  get; set; 
        public virtual DbSet<Rooms_ms> Rooms_ms  get; set; 
     

我的添加方法如下

 ab.Room_id = Convert.ToInt32(ab_rm_no.room_id);
 ab.Guest_id = Convert.ToInt32(frm["guest_id"].ToString());
 ab.Expected_checkin  = Convert.ToDateTime(frm["BookedDateFR"].ToString());
 ab.Expected_checkout = Convert.ToDateTime(frm["BookedDateTO"].ToString());
 
 db.Advance_Bookings.Add(ab);
 db.SaveChanges();

【问题讨论】:

您是否尝试调试并查看 db.Advance_Bookings.Add(ab); 中添加了什么? 您的 DataContext 是否从数据库中加载实体?至少可以说,您的连接字符串似乎很可疑。 @RomanoZumbé 是的,它从数据库中加载实体。 @MalavSevak 您的用户可以插入所需的表吗?或许可以从 Management Studio 确认这一点 @KushalR 我想在数据库表中添加条目。并且肯定没有错误。我已经尝试通过放置断点进行调试 【参考方案1】:

根据 cmets,db.SaveChanges(); 被包装在一个事务中

using (var transaction = new System.Transactions.TransactionScope())

    // some changes and db.SaveChanges();

而且它只有在没有事务的情况下才能工作。

原因是,需要提交事务才能持久保存已保存的更改。

using (var transaction = new System.Transactions.TransactionScope())

    // some changes and db.SaveChanges();

    transaction.Commit();

否则更改将在事务块结束时被丢弃。

【讨论】:

【参考方案2】:

您能否稍微更改一下您的代码并尝试以下操作: 而不是使用 db.Advance_Bookings.Add(ab) 您可以使用以下内容:

db.Entry(ab).State = EntityState.Added;

另外,据我了解,这个问题只有在 DbContext 断开连接时才会发生(因为它没有给出任何错误)。 您可以尝试将代码包装在 using 块中

using (var ab = new DbContext()) 

//instantiate the object and saveChanges.

【讨论】:

以上是关于实体框架 6 不保存更改的主要内容,如果未能解决你的问题,请参考以下文章

实体框架不保存更改

使用实体框架6插入已断开的相关实体

实体框架未将更改保存到数据库中

实体框架,查询包含上下文更改的dbset,而不调用保存更改

在实体框架 6 中更改数据库

无法使用实体框架保存数据库更改