首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码优先数据库w/Filtered视图

代码优先数据库w/Filtered视图
EN

Stack Overflow用户
提问于 2012-12-19 21:01:16
回答 1查看 361关注 0票数 1

下午好,

我目前正尝试首先在winforms应用程序中使用/Code。我的类PrintQueueItem映射到数据库中的一个视图,该视图只返回PrintQueueItem,该视图的PrintStatus值等于“PrintStatus”。这是通过一个DataGridView向最终用户显示的,这样他们就可以在一天结束时查看要批量打印的内容。用户可以添加PrintQueueItem的实例,这也显示在DataGridView中。

当我试图取消设置为打印的项目时,我的问题就出现了。我将PrintStatus设置为取消,然后运行ExecuteSqlCommand来更新数据库。在此之后,我尝试重新加载信息,但是项目仍然显示在DataGridView中。我不知道为什么这是因为当我获得计数(通过本地)后,信息再次加载,它已经减少了一个。你知道为什么会像我想的那样,BindingList为数据绑定提供双向同步,用户界面会随着数据的变化而更新吗?

PrintQueueItem (模型)

代码语言:javascript
复制
public class PrintQueueItem
{
    public PrintQueueItem()
    {
        this.PrintQueueID = Guid.NewGuid();
        this.PrintStatus = "Pending";
        this.DateAdded = DateTime.Now;
    }

    public Guid PrintQueueID { get; set; }
    public Guid DocumentID { get; set; }
    public string PrintStatus { get; set; }
    public DateTime DateAdded { get; set; }

    public virtual Documentation Document { get; set; }
}

初始绑定

代码语言:javascript
复制
this.printQueueBinding.DataSource = db.PrintQueue.Local.ToBindingList();
this.printQueueGridView.AutoGenerateColumns = false;
this.printQueueGridView.DataSource = printQueueBinding;

PrintStatus在PrintQueueItem和Reload上的更新

代码语言:javascript
复制
PrintQueueItem item = printQueueBinding.Current as PrintQueueItem;
if (item == null)
{
    throw new ArgumentNullException("Could not obtain instance of selected 'PrintQueueItem'");
}
item.PrintStatus = "Cancelled";
this.db.Database.ExecuteSqlCommand("exec usp_PrintQueue_Update {0}, {1}",item.PrintQueueID, item.PrintStatus);
this.db.PrintQueue.Load();

一些附加备注

我没有调用ExecuteSqlCommand,而是尝试调用SaveChanges,但遇到了一个异常,声明:

代码语言:javascript
复制
"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded." 

我认为这是因为在更新时,该项目不再在视图中找到。如果不是这样的话,请告诉我。

在应用程序中使用过滤视图而不是过滤视图的原因是,BindingList没有实现IBindingListView,而且我无法实现BindingList.Filter方法来过滤显示在DataGridView中的数据。有关这方面的任何建议也是值得欢迎的。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-20 02:33:12

喝了几杯啤酒,又过了一段时间,让我头脑中混乱的逻辑从今天早些时候起就消失了;我开始思考到底发生了什么,然后我突然想到,当我试图把SaveChanges称为并发异常时,它正在发生。

我没有注意引发的异常类型,因此没有正确地处理它。此后,我将代码更新为以下内容:当发生DbUpdateConcurrencyException (预期的,因为视图不再包含记录)时,将从数据库中刷新遇到此问题的实体:

代码语言:javascript
复制
        try
        {
            if (Program.YesNoQuestion(string.Format("Cancel print job for the selected document?", printQueueGridView.SelectedRows.Count)) != System.Windows.Forms.DialogResult.Yes)
            {
                return;
            }

            PrintQueueItem item = printQueueBinding.Current as PrintQueueItem;
            if (item == null)
            {
                throw new ArgumentNullException("Could not obtain an instance of 'PrintQueueItem'");
            }

            item.PrintStatus = "Cancelled";
            this.db.Database.ExecuteSqlCommand("exec usp_PrintQueue_Update {0}, {1}", item.PrintQueueID,
                                                                                           item.PrintStatus);
            //this.db.PrintQueue.Load();
            this.db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            foreach (DbEntityEntry entry in ex.Entries)
            {
                entry.Reload();
            }
        }

请让我知道是否有更好的方法去做这件事,因为我总是对其他想法开放,并且总是对以正确的方式做事感兴趣。祝你有一个美好的夜晚!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13961126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档