实体框架4.1,通用存储库和可观测集合
本文关键字:可观 集合 存储 框架 实体 | 更新日期: 2023-09-27 18:23:56
我正在用EF 4.1实现存储库模式,http://huyrua.wordpress.com/2011/04/13/entity-framework-4-poco-repository-and-specification-pattern-upgraded-to-ef-4-1
我的问题是,我在一个遗留的Winform应用程序中工作,为了将返回的集合数据绑定到网格控件并检测新项目,我需要一个ObservableCollection,但我在各种存储库模式示例中看到的所有存储库方法都只返回IList集合。
我现在做的是:
IList<AccountType> accountTypes = _repository.GetAll<AccountType>().ToList();
var a1 = new AccountType { Name = "Bank2" };
var a2 = new AccountType { Name = "Cash2" };
accountTypes.Add(a1);
accountTypes.Add(a2);
_repository.UnitOfWork.SaveChanges();
Console.Write("AccountType Saved.");
但是使用此代码,添加的项目不会被存储库持久化。
有人知道如何避免这种情况,并使用EF 4.1从通用存储库返回BindigList或ObservableCollection吗?
编辑:
如果我将返回的IList转换为ObservableColletion,你的意思是像我写的测试代码这样的东西可以吗?:
[TestMethod]
public void CreateAccountList()
{
_accountTypes = new ObservableCollection<AccountType>(_repository.GetAll<AccountType>().ToList());
_accountTypes.CollectionChanged += CollectionChanged;
var a1 = new AccountType { Name = "Bank2" };
var a2 = new AccountType { Name = "Cash2" };
_accountTypes.Add(a1);
_accountTypes.Add(a2);
_accountTypes.Remove(a2);
_repository.UnitOfWork.SaveChanges();
int count = _repository.Count<AccountType>();
Assert.AreEqual(1, count);
}
void CollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
{
switch (notifyCollectionChangedEventArgs.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (var accountType in notifyCollectionChangedEventArgs.NewItems)
{
_repository.Add((AccountType)accountType);
}
break;
case NotifyCollectionChangedAction.Remove:
foreach (var accountType in notifyCollectionChangedEventArgs.OldItems)
{
_repository.Delete((AccountType)accountType);
}
break;
}
}
还是有一种通用的方法?
为什么不能从存储库中获取IList,然后从该列表中构建一个可观察的集合并使用它?
当您将元素添加到从存储库获得的列表/集合中时,您不应该期望元素会添加到EF上下文中。您可以显式调用存储库来保存/删除所需的元素,存储库中会有Add和Remove方法。
如果你想在UnitOfWork中"自动"完成,那么UnitOfWork应该订阅集合的事件,以便知道集合何时更改,但这看起来有点奇怪。