5

首先我应该提一下,这个问题只发生在 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();
        }
    }
}
4

2 回答 2

3

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

于 2011-09-18T04:12:48.017 回答
1

尝试这个:

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,以防需要它。

于 2011-09-07T06:44:58.820 回答