我正在使用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
派生自UnifOfSales
,UnitOfSales
派生自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();
答案 0 :(得分:1)
我确实找到了解决方案!
我必须在DbContext类中为EF模型派生类(Product,派生自BaseCategory类)添加DbSet Products
在此之后我可以使用
ProductGridView.DataSource=_context.Products.Local.ToBindingList();