实体框架4.1,通用存储库和ObservableCollection

时间:2012-02-08 08:52:06

标签: c# entity-framework entity-framework-4.1 ef-code-first repository-pattern

我正在使用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,但我在varios存储库模式上看到的所有存储库方法只是示例返回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;
    }
}

还是有通用的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

如果你想在你的UnitOfWork中“自动”执行它,那么UnitOfWork应该订阅集合的事件,以便知道集合何时被更改,但它看起来有点奇怪。