实体框架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;
    }
}

还是有一种通用的方法?

实体框架4.1,通用存储库和可观测集合

为什么不能从存储库中获取IList,然后从该列表中构建一个可观察的集合并使用它?

当您将元素添加到从存储库获得的列表/集合中时,您不应该期望元素会添加到EF上下文中。您可以显式调用存储库来保存/删除所需的元素,存储库中会有Add和Remove方法。

如果你想在UnitOfWork中"自动"完成,那么UnitOfWork应该订阅集合的事件,以便知道集合何时更改,但这看起来有点奇怪。