Есть ли способ включить локально кэшированные элементы в запрос DBSet? - PullRequest
5 голосов
/ 11 августа 2011

Я просто не могу справиться с Entity Framework, но меня немного смущает поведение объекта DBSet.Когда я вызываю метод Find (), он, кажется, знает о моей коллекции недавно добавленных (но еще не сохраненных) элементов, но когда я пытаюсь выполнить запрос к DBSet, он, кажется, включает только элементы, которые были там все время,Есть ли простой способ обойти это?Я включил некоторый код, который я сделал, чтобы попытаться обойти это, но когда он начинает перебирать элементы из моего "Добавленного" набора изменений, я получаю эту ошибку:

"Невозможно создать постоянное значение типа EntityType. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). "

internal DbContext Context  { get; set; }
protected DbSet<T> DBSet    { get; set; }

public virtual IEnumerable<T> Get(
    Expression<Func<T, bool>> filter = null,
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
    bool ignoreCachedChanges = false)
{
    IQueryable<T> oReturn = DBSet;

    // This block is intended to adjust the queryable source to account for changes
    if (!ignoreCachedChanges)
    {
        oReturn = oReturn.Except(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Deleted).Select(x => x.Entity));
        oReturn = oReturn.Union(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Added).Select(x => x.Entity));
    }
    if (filter != null)
        oReturn = oReturn.Where(filter);

    if (orderBy != null)
        return orderBy(oReturn).ToList();
    else
        return oReturn.ToList();
}

// NOTE: Get By ID uses Find which considers the queued-but-not-yet-applied changes
public virtual T GetByID(object id)
{
    return DBSet.Find(id);
}

(В случае, если контекст помогает,Я делаю это потому, что хочу настроить модульный тест, в котором я заполняю свой (локальный) контекст элементами, которые соответствуют моей конкретной среде тестирования ... Я бы сразу же не стал применять эти изменения, поскольку онидействительно применимо только для этого конкретного теста, но я могу, если это необходимо ... При этом я был удивлен, увидев, что хранилище не включает измененные элементы в свои запрашиваемые результаты - если только я не выполняю FindByID - поэтому яЯ также надеюсь, что смогу либо устранить это явное несоответствие, либо лучше понять, почему это невозможно, или не очень хорошая идея? :))

1 Ответ

2 голосов
/ 11 августа 2011

Исключение говорит это: вы не можете отправить список типов сущностей (вашего универсального типа T) на сервер для выполнения Except и Union в SQL с этими коллекциями «постоянных» объектов. В основном вы должны применить Except и Union в памяти с LINQ to Objects, что означает: после отфильтрованный результат с сервера был материализован (то есть где-то после .ToList()). Вы должны применить фильтр второй раз к списку объектов в контексте, которые находятся в состоянии Added.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...