实体框架 - (主要详细信息)如何更新与Master

时间:2016-05-31 13:53:08

标签: c# winforms entity-framework

我正在尝试为我的项目Entity Framework Databinding with WinForms执行此操作 但我没有使用单一形式,而是使用了两种形式。

CategoryDataGridView上显示

Form1Form1上有一个编辑按钮,该按钮将加载包含ProductsDataGridView的Form2(所选类别的产品列表) )和保存按钮以保存更改

我的Form2上有以下代码

ProductContext _context = new ProductContext();
public int SeletedCategID { get; set; }

private void Form2_Load(object sender, EventArgs e)
{
    _context.Products.Where(c => c.CategoryId ==     SeletedCategID).ToList();
    productsBindingSource.DataSource =     (_context.Products.Local).ToList();
}

private void SaveBtn_Click(object sender, EventArgs e)
{
    this.Validate();

    foreach (var product in _context.Products.Local.ToList())
    {
        if (product.Category == null)
        {
            _context.Products.Remove(product);
        }
    }
    this._context.SaveChanges();

    this.productsDataGridView.Refresh();

    Form1 frm1 = (Form1)Application.OpenForms["Form1"];
    frm1.Activate();
    frm1.Refresh();
    this.Dispose();
}

我现在的问题是只对产品保存到DB进行编辑。添加&删除不会保存到数据库中。

2 个答案:

答案 0 :(得分:2)

设置context.Products.Local时,应将context.Products.Local.ToList()设置为绑定源的数据源。

context.Products.Local获得一个ObservableCollection<Product>,它将与上下文保持同步,因此所有实体更改(添加/删除/编辑)都将按上下文进行跟踪。
当您使用context.Products.Local.ToList()时,您使用的List<T>将不会与上下文保持同步,并且不会跟踪添加/删除,并且在调用SaveChanges时,您的添加和删除将不会被保存,而Edits将被保存。

  

DbSet<TEntity>.Local   得到一个代表所有人的本地视图的ObservableCollection<T>   此集合中添加,未更改和已修改的实体。这种本地观点   将在上下文中添加或删除实体时保持同步。   同样,添加到本地视图或从本地视图中删除的实体将   自动添加到上下文中或从上下文中删除。

<强>代码:

您可以这样加载数据:

context.Products.Where(x => x.CategoryId == SelectedCategoryId).ToList();
this.productBindingSource.DataSource = context.Products.Local;

您可以这样保存数据:

this.Validate();
this.productBindingSource.EndEdit();
context.Products.Local
       .Where(x => x.CategoryId == 0)
       .ToList().ForEach(x =>
       {
           x.CategoryId = SelectedCategoryId;
       });
context.SaveChanges();
this.DialogResult = DialogResult.OK;

您也不需要删除具有null类别的产品的代码部分,因为您没有使用master-detail。这是一个可编辑的列表。

另一方注意事项是,在关闭第二个表单后,不要忘记以第一种形式重新加载数据。由于您在表单中使用了不同的上下文,因此他们不了解其他上下文中的更改。

答案 1 :(得分:0)

这不可行,你必须删除产品而不是本地!

        foreach (var product in _context.Products.ToList())
        {
            if (product.Category == null)
            {
                _context.Products.Remove(product);
            }
        }
        this._context.SaveChanges();

如果您只想删除本地:

_context.Locals.Remove(local);

我不知道你在加载对象列表中做了什么,但如果你正在尝试更改或删除在DbContext中找不到的产品或本地实体,或者它是实体的副本,那么这不会工作。您需要原始检索的实体。