【问题标题】:Entity framework doesn't save data entries in database实体框架不会在数据库中保存数据条目
【发布时间】:2011-09-07 05:19:33
【问题描述】:

首先我要提一下,这个问题只发生在 Windows 窗体应用程序中,并且在 Web 模式下的相同程序(例如 MVC3)可以完美运行。

几天前,我使用带有 SQL Express 数据库的 Visual Studio 2010 Ultimate 编写了一个非常简单的 Windows 窗体程序。我通过选择 Add > New item > Service-Based database 和基于此数据库的实体数据模型以相同的方式添加了数据库。我使用实体框架向表中添加一些新记录。我之前用 VS 2008 SP1 做过这样的事情没有问题,所以我也做了同样的事情。程序编译并运行没有错误,我输入了一些新数据。退出程序后,我回到数据库,什么也没发生。我输入的任何信息都没有被保存。 我一步步调试程序,一切正常。 下面的代码与一个具有上述问题的非常简单的程序有关。数据库只有一张表(书):

namespace Book
{
    public partial class BookForm : Form
    {
        BookDatabaseEntities db = new BookDatabaseEntities();

        public BookForm()
        {
            InitializeComponent();
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            Book bookToCreate = new Book();

            bookToCreate.Id = Guid.NewGuid();
            bookToCreate.Title = titleTextBox.Text;

            db.Books.AddObject(bookToCreate);
            db.SaveChanges();
        }
    }
}

如果有人帮助我,我将不胜感激。提前致谢。

..................

编辑后:

namespace Book
{
    public partial class BookForm : Form
    {
        //BookDatabaseEntities db = new BookDatabaseEntities();

        public BookForm()
        {
            InitializeComponent();
        }

        private void saveButton_Click(object sender, EventArgs e)
        {
            var db = new BookDatabaseEntities();
            var bookToCreate = db.Books.CreateObject();

            //Book bookToCreate = new Book();

            bookToCreate.Id = Guid.NewGuid();
            bookToCreate.Title = titleTextBox.Text;

            db.AcceptAllChanges();
            db.Books.AddObject(bookToCreate);
            db.SaveChanges();
        }
    }
}

【问题讨论】:

  • 尝试替换“new db.Books();”用“db.Books.CreateObject();”
  • 确保您正在检查正确的数据库。
  • @Davide:我按照你说的使用了 CreateObject,但问题仍然存在。
  • @Ladislav:是的,我确定。这个简单的程序只有一个数据库文件
  • 请向我们展示您的最新代码

标签: .net visual-studio-2010 entity-framework-4 savechanges windows-applications


【解决方案1】:

感谢Patrice Scribe,经过大量搜索和询问,我终于在 MSDN 论坛中找到了解决方案 你可以看到 here

【讨论】:

  • 谢谢Monoloox。经过长时间的搜索,我终于得到了你的答复。
【解决方案2】:

试试这个:

db.Attach(bookToCreate);
db.SaveChanges();

编辑:

我在生产中的类库(我的 DAL)中有这段代码,它工作正常:

using (var dbContext = new DbEntities())
    {
        var job = dbContext.RiskToolJob.CreateObject();

        job.AnalysisDataID = analysisDataID;

        job.JobRmsAnalysisID = RMSAnalysisID;
        job.UserName = userName;

        job.JobCreated = DateTime.UtcNow;

        dbContext.RiskToolJob.AddObject(job);

        dbContext.SaveChanges();

        return job.DataId;
    }

请注意,实际上我没有分配 PK (DataId),因为它将由数据库分配,我将其返回给调用者,以便调用 save 方法的人知道自动生成的 ID,以备不时之需。

【讨论】:

  • 亲爱的 Davide ... 我照你说的做了,但结果还是一样。我认为问题在于 SaveChanges() 方法,因为在执行 (db.Books.AddObject) 或 (db.Books.Attach) 后,该对象已添加到 ObjectStateManager 中,并且 SaveChanges 似乎无法将其保存到数据库中。但是在输入过程中没有报错
  • 另一件事.. 正如我所说,当我在 Web 表单或 MVC 中编写相同的代码时,它可以正常工作而没有这个问题。它只发生在 Windows 窗体应用程序中,我不知道为什么。
  • Davide 为什么 db.Attach 会提供帮助?来自 MS 文档 - “db.Attach 用于使用已知数据库中已存在的实体重新填充上下文。因此,SaveChanges 不会尝试将附加实体插入到数据库中,因为假定它已经存在”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
相关资源
最近更新 更多