使用EF5类将DataGridView绑定到数据库而不将更改发送到数据库

时间:2013-09-24 19:39:05

标签: c# entity-framework data-binding

我正在使用Entity Framework 5.0 + .NET 4.5

我使用EF Model第一种方法创建了数据库,我希望使用EF类将DataGridView绑定到数据库,以便对数据库或DataGridView的任何更改自动同步。

这是我的代码:

//form level fields
private BindingList<Product> _products;
private BindingSource _productSource = new BindingSource(); 

... in the form load event
//load the data from database using EF classes
var tmp = _context.BaseCategorySet.OfType<Product>().ToList();

//converting to IBindingList
_products = new BindingList<Product>(tmp);
_products.AllowEdit = true;
_products.AllowNew = true;

_productSource.DataSource = _products; 

//setting GridControl's data source
ProductGrid.DataSource = _productSource;

我可以添加新行或更改数据,但这些更改不会发送到数据库 - 我缺少什么?

我希望找到解决方案的其他事项......

1)我添加了一个Save按钮,用于显式调用将网格控件的数据更新到数据库,代码为:

_productSource.EndEdit();
_context.SaveChanges();

- &gt;这不会导致将新记录存储到数据库中

2)我添加了一个代码来添加新记录,其中包含一系列用于单个记录属性的控件(Textboxes,DatePickers)

var x = _context.BaseCategorySet.Create<Product>();
//settting all the x properties with values
//that are set in aforementioned individual controls

_context.BaseCategorySet.Add(x);
_context.SaveChanges();

- &gt;当我使用这种技术添加新记录时 - 它存储在数据库中,但又一次奇怪的行为 - 这个新记录不会自动加载到网格控件中(但应该是,因为我是数据绑定网格到相应的EF DbSet ...)

还有一个奇怪之处 - 我在DataGridView控件中对加载到数据库的记录所做的更新 - 这些更新被发送到数据库......

3)我从DevExpress XtraGrid切换到stadard DataGridView控件,但这没有帮助......

我搜索了大量有关EF数据绑定的主题但没有成功......

不知道这是否重要,但我在我的实体模型中使用继承:Product派生自UnifOfSalesUnitOfSales派生自BaseCategory类。

我尝试了一件事

我尝试了Ladislav Mrnka在这篇文章中提出的(..)。Local.ToBindingList How to make two way-databinding using EF in winforms?

它确实将更改发送回数据库,但更改仅存储在基类表(BaseCategory)中,但也有一个派生类的表。这是我用于绑定的代码

_context.BaseCategorySet.OfType<Product>.Load(); 
//i tried to use derived class with OfType<Product> to ensure that compiler
//knows that this is instance of derived class (Product), 
//not the base class BaseCategory, 
//but I can not get "Local" working with OfType...
ProductGridView.DataSource = _context.BaseCategorySet.Local.ToBindingList(); 

1 个答案:

答案 0 :(得分:1)

我确实找到了解决方案!

我必须在DbContext类中为EF模型派生类(Product,派生自BaseCategory类)添加DbSet Products

在此之后我可以使用

ProductGridView.DataSource=_context.Products.Local.ToBindingList();