【发布时间】:2016-12-20 13:31:20
【问题描述】:
我的应用程序中有以下 DbContext 类可以正常工作:
public partial class BaseContext : DbContext
{
public virtual DbSet<Customer> Customers { get; set; }
public virtual DbSet<Contact> Contacts { get; set; }
}
public partial class MyAppContext : BaseContext
{
public new IQueryable<Customer> Customers()
{
return base.Customers.Where(n => n.Active == true);
}
public new IQueryable<Contact> Contacts()
{
return base.Contacts.Where(n => n.Active == true);
}
}
我希望在我的应用程序中对客户或联系人的所有呼叫都过滤掉非活动记录。这种方法效果很好,但有人可能会在我的基本上下文中意外调用客户或联系人,我想避免这种情况。
我认为理想的解决方案是使我的基本上下文中的成员受到保护,以便它们只能由 MyAppContext 访问,但这会失败,因为在 2 个 DbSet 中从未加载任何数据。例如
public partial class BaseContext : DbContext
{
protected virtual DbSet<Customer> Customers { get; set; }
protected virtual DbSet<Contact> Contacts { get; set; }
}
当我将这些设置为受保护时,不会加载任何数据,当它们公开时一切都很好(但这会公开这些我想避免的)。
有人对如何解决这个问题有任何建议吗?
【问题讨论】:
-
我认为这与 EF 内部的工作方式有关。它将尝试从外部传播违反访问修饰符的属性。
-
我知道它适用于对象的属性,那么如何制作
DbSetsprotected internal? -
这是伪封装。消费者将始终可以访问
context.Set<T>()。此外,这不会阻止通过导航属性获得不活跃的客户。软删除需要更严格的方法。
标签: c# .net asp.net-mvc entity-framework