2016-06-20 3 views
0

У меня есть куча объектов DTO, которые все наследуют от класса DtoBase с некоторыми свойствами, такими как Id, CreatedDate и Disabled.Entity Framework Code First - объекты все наследуют базовый класс, как исключить записи с отключенным свойством

public class MyAppContext : ApplicationDbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<B> Bs { get; set; } 
} 

public class A : Base 
{ 
    public bool LikesMilk { get; set; } 
} 

public class B : Base 
{ 
    public string Name { get; set; } 
} 

public class Base 
{ 
    public int Id { get; set; } 
    public bool Disabled { get; set; } 
} 

Когда приходит время запрашивая DB, есть метод расширения или что-то я мог бы написать, чтобы исключить все отключенные записи всех запросов для всех объектов?

//both should exclude disabled records 
db.As.FirstOrDefault(x => x.LikesMilk) 
db.Bs.ToList() 
+0

Типичный метод должен был бы построить представление в SQL, который возвращает только включенные строки, то есть EF ссылку до просмотра. – jleach

+0

Вам нужны первичные ключи, вы бы просто положили один на базовый класс? – prospector

+0

Ввод первичного ключа в базовый класс добавляет его ко всем наследующим классам. – user1455010

ответ

1

Я закончил использование этого пакета NuGet EntityFramework.DynamicFilters, и его было очень легко реализовать. https://www.nuget.org/packages/EntityFramework.DynamicFilters

using EntityFramework.DynamicFilters; 
public class MyAppContext : ApplicationDbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<B> Bs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Filter("IsDisabled", (Base x) => x.Disabled, false); 
    } 
} 

public class A : Base 
{ 
    public bool LikesMilk { get; set; } 
} 

public class B : Base 
{ 
    public string Name { get; set; } 
} 

public class Base 
{ 
    public int Id { get; set; } 
    public bool Disabled { get; set; } 
} 
+2

Определенно используйте это вместо того, чтобы делать это самостоятельно, как я написал выше. – user1455010

+0

Я начал по твоему пути, затем решил поработать над некоторыми материалами NuGet. Это выглядело намного чище. – Buchannon

+0

Провели ли какое-либо профилирование производительности, чтобы увидеть, как это влияет на запросы? – user1455010

2

Я сделал это почти так же, как описано в этой статье. http://www.codeguru.com/csharp/csharp/soft-deleting-entities-cleanly-using-entity-framework-6-interceptors.html

По существу, вы создаете атрибут, обозначающий столбец как столбец «IsDeleted» (в вашем случае «Отключено»). Затем вы создаете перехватчик, который делает 2 вещи:

  • Intercept удалить команды и изменить их обновляют
  • перехватывать все запросы и отфильтровать мягкий удаленные объекты.