1

我在 Azure MVC 应用程序中使用 EF4 Code First 从 SQL Azure 数据库中检索数据。

该应用程序总共将有大约 200 名用户,分布在十几个使用相同应用程序的组织中。SQL Azure DB 将主要存储客户联系信息等。

SQL Azure 数据库中的所有表都包含一个名为 OrgansiationId 的字段,它是每个组织唯一的 GUID。保存的所有数据都包括与保存数据的人的组织相对应的 OrganisationId。

重要的是,用户只能从他们自己的组织添加/编辑/查看信息。

所以我的问题是,使用 LINQ 来确保任何 Select 语句只返回用户 OrganisationId 的信息的推荐方法是什么,而不必手动将“WHERE OrganisationId == organizationId”附加到每个 Select 语句,这很容易受到人为错误的影响. (即忘记包含它,以免过滤掉Organsation,噩梦般的场景!)

是否有一种可接受的方式来实现这一点,可能是通过使用额外的 WHERE 语句包装 LINQ 语句,以便对所有 LINQ Select 语句自动完成?

4

1 回答 1

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;
}
于 2012-11-27T16:00:04.490 回答