Предоставление EntityFramework 4 сущностей как IList вместо IObjectSet - PullRequest
1 голос
/ 04 января 2011

У меня есть объект POCO «Клиент» в моем проекте Entity Framework 4.Я хочу, чтобы мои сущности Customer отображались на моих верхних уровнях как общий список, а не как ObjectSet.

У меня есть интерфейс IUnitOfWork, который выглядит следующим образом:

public interface IUnitOfWork
{
   string Save();
   IList<Customer> Customers { get; }
}

Внизу на моей Entity FrameworkDAL (который реализует вышеуказанный интерфейс) У меня есть следующее:

public class EntityContainer : ObjectContext, IUnitOfWork
{
    private IObjectSet<Customer> _customers;

    public IList<Customer> Customers 
    {
       get
       {
         if (_customers == null)
         {
             _customers = CreateObjectSet<Customer>("Customers");                    
         }
         return _customers.ToList<Customer>() ;
       }            
    }
}

Однако строка «CreateObjectSet (« Customers »)» не работает.Каждый раз, когда я пытаюсь добавить нового «Клиента», ничего не происходит.Интересно, что если я вернусь к использованию IObjectSet, то код работает.Например:

public interface IUnitOfWork
{
    string Save();
    IObjectSet<Contact> Contacts { get; }
}


public class EntityContainer : ObjectContext, IUnitOfWork
{
    private IObjectSet<Customer> _customers;

    public IObjectSet<Customer> Customers 
    {
       get
       {
         if (_customers == null)
         {
             _customers = CreateObjectSet<Customer>("Customers");                    
         }
         return _customers;
       }            
    }
}

IQueryable также работает, но я не могу заставить работать IList и не знаю почему.У кого-нибудь есть идеи?

#

Исправление к первоначальному вопросу.Использование IQueryable не работает, как и IEnumerable.Это связано с тем, что в репозитории Customer необходимо предоставить методы «Добавить» и «Удалить» для добавления / удаления из коллекции объектов (добавление или удаление объектов клиента в приведенном выше примере).Ни IQueryable, ни IEnumerable не позволяют добавлять или удалять объекты;вместо этого необходимо использовать ICollection или IList.Это оставляет меня обратно к моей первоначальной проблеме.Я не хочу выставлять свою коллекцию в хранилище как ObjectSet.Я хочу использовать тип, который не привязан к EntityFramework, т. Е. Я хочу использовать общий список.

У кого-нибудь есть еще предложения?Я подозреваю, что есть простой способ сделать это, но я недостаточно знаком с фреймворком, чтобы понять это.

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Вы, кажется, пропускаете Репозиторий во всем этом.Репозиторий обычно является тем, что обрабатывает преобразование из ObjectSet<T> в IList<T> (или, в большинстве случаев, IEnumerable<T> или IQueryable<T>).

public class EntityContainer : ObjectContext
{
    private IObjectSet<Customer> _customers;

    public IObjectSet<Customer> Customers
    {
        get
        {
            return _customers ?? 
                ( _customers = CreateObjectSet<Customer>("Customers");
        }
    }
}

public class CustomerRepository
{
    EntityContext _context = new EntityContext();

    public IQueryable<Customer> FindAll()
    { 
        return _context.Customers;
    }

    public Customer FindById(int id)
    {
        return _context.Customers.Single(c => c.Id == id);
    }

    // And so on.
}

Обычно я заставляю свой UnitOfWork создавать репозиторииэто должно быть зачислено в Unit of Work, чтобы все, что делается через репозитории, было объединено в одну операцию.

Имейте в виду, что мой UnitOfWork будет иметь только два метода.Один для получения хранилища, а другой для совершения работы.Все данные извлекаются из хранилищ.

1 голос
/ 04 января 2011

_customers.ToList () является виновником. ToList выполняет запрос и копирует все элементы из этого запроса в новый объект коллекции. этот новый объект коллекции не предоставляет возможности отслеживания, которые есть у ObjectSet.

...