我的问题是我正在使用传统的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;
}
}
还是有通用的方法吗?
答案 0 :(得分:1)
为什么不能从存储库中获取IList,然后从此列表中构建一个可观察的集合并使用它?
当您将元素添加到从存储库获取的列表/集合中时,您不应期望将元素添加到EF上下文中。您可以显式调用存储库以保存/删除所需的元素,您将在存储库中添加和删除方法。
如果你想在你的UnitOfWork中“自动”执行它,那么UnitOfWork应该订阅集合的事件,以便知道集合何时被更改,但它看起来有点奇怪。