我在Azure MVC应用程序中使用EF4 Code First从SQL Azure数据库中检索数据。
该应用程序总共有大约200个用户,分布在十几个使用相同应用程序的组织中。 SQL Azure DB将主要存储客户端联系信息等。
SQL Azure数据库中的所有表都包含一个名为OrgansiationId的字段,该字段是每个组织唯一的GUID。保存的所有数据包括与保存数据的人员组织相对应的OrganisationId。
用户只能添加/编辑/查看自己组织的信息。
所以我的问题是,建议使用LINQ的方法是什么,以确保任何Select语句只返回Users OrganisationId的信息,而不必手动将“WHERE OrganisationId == organisationId”附加到每个Select语句,这是易受攻击的人为错误。 (即忘记包括它以便Organsation不被过滤,噩梦场景!)
是否有一种可接受的方法来实现这一点,可能是通过使用附加的WHERE语句包装LINQ语句,以便自动完成所有LINQ Select语句?
答案 0 :(得分:2)
我实施了一个非常相似的应用。我只是将DbContext包装在一个包装的上下文中:
当这是原始背景时:
public class MyContext : DbContext {
public DbSet<MyTable> MyTable { get; set; }
}
然后包装的上下文如下所示:
public class MyWrappedContext {
protected MyContext InternalContext { get; set; }
public Guid OrganizationId { get; set; }
public IQueryable<MyTable> MyTable
{
get
{
return InternalContext.MyTable
.Where(t => t.OrganizationId == OrganizationId);
}
}
}
为了添加,删除和更新实体,我在WrappedContext上有以下方法:
public void Add<T>(T entity) where T : class
{
DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
dbEntityEntry.State = EntityState.Added;
}
public void Remove<T>(T entity) where T : class
{
DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
dbEntityEntry.State = EntityState.Deleted;
}
public void Update<T>(T entity) where T : class
{
DbEntityEntry<T> dbEntityEntry = InternalContext.Entry(entity);
dbEntityEntry.State = EntityState.Modified;
}