Entity Framework 4.1, Универсальный репозиторий и ObservableCollection - PullRequest
2 голосов
/ 08 февраля 2012

Я реализую шаблон репозитория с 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.");  

, но с этим кодом,добавленные элементы не сохраняются в хранилище.

У кого-нибудь есть идеи, как этого избежать и вернуть BindigList или ObservableCollection из общего хранилища, используя EF 4.1?

РЕДАКТИРОВАНИЕ:

Если я преобразовываю 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 Ответ

1 голос
/ 08 февраля 2012

Почему вы не можете получить IList из репозитория, затем создать наблюдаемую коллекцию из этого списка и просто работать с ней?

Не следует ожидать, что элементы будут добавлены в контекст EF при добавлении их в список / коллекцию, которые вы получаете из репозитория. Вы можете напрямую вызывать хранилище, чтобы сохранить / удалить нужные элементы, в вашем хранилище будут методы Add и Remove.

Если вы хотите сделать это «автоматически» в вашем UnitOfWork, то UnitOfWork должен подписаться на события коллекции, чтобы знать, когда коллекция изменяется, но это выглядит немного странно.

...