我正在尝试为我的项目Entity Framework Databinding with WinForms执行此操作 但我没有使用单一形式,而是使用了两种形式。
CategoryDataGridView
上显示 Form1
,Form1
上有一个编辑按钮,该按钮将加载包含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进行编辑。添加&删除不会保存到数据库中。
答案 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中找不到的产品或本地实体,或者它是实体的副本,那么这不会工作。您需要原始检索的实体。