0

实体框架的新手,但我认为这应该很简单。

我的表单加载从我的实体创建了一个上下文。我创建了一个客户端列表,并有一个绑定源,我将客户端分配给它。绑定源被分配给一个绑定导航器——clientBindingNavigator。

private void ClientExtForm_Load (object sender, EventArgs e)
        {

        _context = new IDVisitorEntities ();

        List<IDVM.Client> clients = _context.Clients.ToList ();

        clientBindingSource.DataSource = clients;

        }

摘自 ClientExtForm.Designer.cs

        //
        // clientBindingNavigator
        // 
        this.clientBindingNavigator.AddNewItem = this.bindingNavigatorAddNewItem;
        this.clientBindingNavigator.BindingSource = this.clientBindingSource;
        this.clientBindingNavigator.CountItem = this.bindingNavigatorCountItem;
        this.clientBindingNavigator.DeleteItem = this.bindingNavigatorDeleteItem;
        this.clientBindingNavigator.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.bindingNavigatorMoveFirstItem,
        this.bindingNavigatorMovePreviousItem,
        this.bindingNavigatorSeparator,
        this.bindingNavigatorPositionItem,
        this.bindingNavigatorCountItem,
        this.bindingNavigatorSeparator1,
        this.bindingNavigatorMoveNextItem,
        this.bindingNavigatorMoveLastItem,
        this.bindingNavigatorSeparator2,
        this.bindingNavigatorAddNewItem,
        this.bindingNavigatorDeleteItem,
        this.clientBindingNavigatorSaveItem});

当我单击导航器工具栏上的 Delete Button 时, ClientBindingSource.Count 已减少 1 。

private void clientBindingNavigatorSaveItem_Click (object sender, EventArgs e)
        {
        this.OnSave ();
        }



public override void OnSave ()
        {

        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Deleted))
            {
           // nothing shows up in this
            }            
        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Modified))
            {
            // when modified 
            }

        foreach (ObjectStateEntry entry in _context.ObjectStateManager.GetObjectStateEntries (EntityState.Added))
            {
            // when adding this finds it                    
            }

        clientBindingSource.EndEdit ();

        visitorHostsBindingSource.EndEdit ();

        _context.SaveChanges ();

        base.OnSave (); 
        }

看起来好像导航器正在从集合中删除该项目。

添加信息: 在导航器中,DeleteItem 按钮似乎对应于 RemoveCurrent 方法(点击事件调用它)。在 RemoveCurrent 做这件事之前不知道如何配合。

执行删除的选项有哪些?

4

3 回答 3

0

从 clientBindingSource 中删除项目将不会影响数据库级别的项目。您必须显式调用_context.Clients.DeleteObject(deletedClient);您必须通过 ObjectContext 执行所有 CRUD 操作。

于 2012-08-13T21:49:31.993 回答
0

环顾四周后发现一些博客建议不要使用默认的 DeleteItem。

this.clientBindingNavigator.DeleteItem = null;//= this.bindingNavigatorDeleteItem;

在我的例子中,为了明确 BindingNavigator,我在 Items 列表中用新按钮this.toolStripButton1替换了 this.bindingNavigatorDeleteItem。

this.clientBindingNavigator.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
        this.bindingNavigatorMoveFirstItem,
        this.bindingNavigatorMovePreviousItem,
        this.bindingNavigatorSeparator,
        this.bindingNavigatorPositionItem,
        this.bindingNavigatorCountItem,
        this.bindingNavigatorSeparator1,
        this.bindingNavigatorMoveNextItem,
        this.bindingNavigatorMoveLastItem,
        this.bindingNavigatorSeparator2,
        this.bindingNavigatorAddNewItem,
        this.toolStripButton1,
        this.clientBindingNavigatorSaveItem});

新按钮的创建如下所示:

        // 
        // toolStripButton1
        // 
        this.toolStripButton1.Image = ((System.Drawing.Image) (resources.GetObject ("bindingNavigatorDeleteItem.Image")));
        this.toolStripButton1.RightToLeftAutoMirrorImage = true;
        this.toolStripButton1.Name = "toolStripDeleteItem";
        this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
        this.toolStripButton1.Text = "Delete";
        this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);

Click 事件然后调用 RemoveCurrent (就像默认值一样),但我可以获取当前实体并将其存储在一个数组列表中以供保存时使用。

private void toolStripButton1_Click (object sender, EventArgs e)
        {
        var currentclient = (Client) clientBindingSource.Current;
        clientstodelete.Add (currentclient);
        clientBindingSource.RemoveCurrent ();
        }

我不需要创建新按钮,我只需要将 this.clientBindingNavigator.DeleteItem 不绑定到按钮。因为 DeleteItem 在调用 BindingSource.RemoveCurrent() 的后台创建了一个单击事件。我可能会将按钮更改回创建的默认按钮,但为了说明,希望每个人都能看到发生了什么。

于 2012-08-14T18:55:08.713 回答
0

我同意如果我刚刚使用 RemoveCurrent() 删除了记录,那么必须直接从表中删除记录似乎很奇怪。但这就是它的本质……这在一次大扫除中处理了 datagridview 和数据源中的记录。

这是我解决问题的方法:

        t_StaffDaysOff sdo = (t_StaffDaysOff)t_StaffDaysOffbindingSource.Current;
        t_StaffDaysOffbindingSource.RemoveCurrent();
        t_StaffDaysOffbindingSource.EndEdit();
        db.t_StaffDaysOff.Remove(sdo);
        db.SaveChanges();
于 2017-10-08T14:26:44.500 回答