2012-03-06 9 views
7

Estamos buscando una forma de filtrar automáticamente todas las operaciones CRUD por una ID de inquilino en Entity Framework.Entity Framework para arquitectura Multi-tenant - filtraciones tabla única por ID de inquilino

Las ideas que pensamos eran:

  • El uso de valores de tabla definidas por el usuario funciones
  • El uso de procedimientos almacenados (pero que realmente no quieren, ya que estamos utilizando un ORM para evitar hacerlo)
  • De alguna manera cómo modificar las plantillas utilizadas para generar el SQL para agregar una cláusula where en cada declaración.
  • De alguna manera cómo modificar las plantillas utilizadas para generar el LINQ en los controladores (podemos usar MVC).

¿Algún consejo?

-gracias Alex.

Respuesta

13

Uso definidos por el usuario funciones de tabla valioso

Tabla valioso función sólo están disponibles en .NET 4.5 Beta (y no está disponible en código primero). Su uso no lo ayudará porque tendrá que usar la función en cada consulta LINQ para que sea igual a usar la cláusula where.

El uso de procedimientos almacenados (pero que realmente no quiere hacerlo, ya que estamos utilizando un ORM para no tener que hacerlo)

Puede ser útil para algunas consultas complejas especiales pero en general se no es lo que quieres

De alguna manera cómo modificar las plantillas utilizadas para generar el SQL para agregar una cláusula where en cada instrucción.

Demasiado complejo y en un nivel de abstracción completamente diferente.

De alguna manera la modificación de las plantillas utilizadas para generar el LINQ en los controladores (podemos usar MVC).

Cerca de la solución ideal. Sólo hay que envolver el acceso a su conjunto de entidades en algún código que se verá así:

public class MultiTenantAccess<T> where T : IMultitenant 
{ 
    private IDbSet<T> set; 

    ... 

    public IQueryable<T> GetQuery(int tenantID) 
    { 
     return set.Where(e => e.TenantID == tenantID); 
    } 
} 

A veces esto es básico para algo llamado repositorio genérico, pero en realidad es sólo una envoltura alrededor conjunto EF. Siempre utilizará GetQuery para consultar su almacén de datos en lugar de usar DbSet directamente.

+0

Excelente respuesta, gracias @Ladislav. –

+0

Hola @Ladislav Tengo problemas para visualizar lo que IMultitenant debería contener, ¿tienes un momento libre que puedas elaborar?Gracias :-) –

+0

En realidad, solo estoy pensando, supongo que IMultitenant contendría TenantId? ¿Estoy en las líneas correctas? –

3

también puede separar los datos de los inquilinos en diferentes bases de datos
o en la misma base de datos, pero con diferentes esquemas? Puede leer más sobre esto en un artículo antiguo de MSDN llamado "Multi-Tenant Data Architecture"

+1

Gracias Oakman, sí, he leído que en el pasado es un buen artículo. En ese momento, solo un esquema compartido de db compartido era adecuado para nosotros, pero es un enlace que vale la pena enumerar con esta pregunta +1 de mi parte. –

Cuestiones relacionadas