скажите EF не рассматривать записи с битовым полем = 1 (isDeleted) - PullRequest
4 голосов
/ 23 февраля 2011

все таблицы имеют битовое поле IsDeleted

есть ли способ сказать EF не учитывать их при выполнении запросов.

или я просто должен указать это каждый раз как Where(o => o.IsDeleted != true)

(сначала используйте код EF4 CTP5)

1 Ответ

0 голосов
/ 23 февраля 2011

Я решил это, сделав это в своем общем репозитории, я также создал репозиторий только для чтения для сущностей, у которых нет isDeleted (они вообще не управляются приложением, только чтение), репо только для чтения получает все записи

Простое хранилище наследует только для чтения и переопределяет методы, которые не должны возвращать объекты, помеченные isDeleted = false;

сущности, которые должны быть просто помечены IsDeleted = true, наследуются от DelEntity

public class DelEntity : Entity, IDel
{
    public bool IsDeleted { get; set; }
}

мой общий репозиторий:

public class Repo<T> : ReadRepo<T>, IRepo<T> where T : DelEntity, new()
    {
        public Repo(IDbContextFactory a) : base(a)
        {
        }

...
        public override IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
        {
            return c.Set<T>().Where(predicate).Where(o => o.IsDeleted == false);
        }

        public override IEnumerable<T> GetAll()
        {
            return c.Set<T>().Where(o => o.IsDeleted == false);
        }
    }

мой репозиторий для операций только для чтения

public class ReadRepo<T> : IReadRepo<T> where T : Entity, new()
    {
        protected readonly DbContext c;

        public ReadRepo(IDbContextFactory f)
        {
            c = f.GetContext();
        }

        public T Get(long id)
        {
            return c.Set<T>().Find(id);
        }

        public virtual IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
        {
            return c.Set<T>().Where(predicate);
        }

        public virtual IEnumerable<T> GetAll()
        {
            return c.Set<T>();
        }

        public int Count()
        {
            return c.Set<T>().Count();
        }

    }

это решение немного специфично для моего случая, но, надеюсь, вы можете получить некоторые идеи из него

...