2012-03-06 14 views
7

Stiamo cercando un modo per filtrare automaticamente tutte le operazioni CRUD da un tenant ID in Entity Framework.Entity Framework per architettura multi-tenant: filtraggio tabella singola per titolare ID

Le idee abbiamo pensato di stati:

  • Utilizzando valori di tabella funzioni definite dall'utente
  • Utilizzo di stored procedure (ma in realtà non vogliono, come stiamo usando un ORM per evitare di farlo
  • Alcuni come modificare i modelli utilizzati per generare l'SQL per aggiungere una clausola where su ogni istruzione.
  • Alcuni come modificare i modelli utilizzati per generare il LINQ nei controller (possiamo utilizzare MVC).

Qualche consiglio?

-thanks Alex.

risposta

13

Uso valori di tabella funzioni definite dall'utente

Tabella funzione a valori sono disponibili solo in NET 4.5 Beta (e non disponibile nel primo codice). Usarli non ti aiuterà ancora perché dovrai utilizzare la funzione in ogni query LINQ, quindi è come usare la clausola where.

Utilizzo di stored procedure (ma non lo facciamo veramente vogliamo, come stiamo usando un ORM per evitare di farlo)

può essere utile per alcune query complesse speciali ma in generale è non quello che vuoi

Alcuni come modificare i modelli utilizzati per generare l'SQL per aggiungere una clausola where su ogni istruzione.

Troppo complesso e su un livello completamente diverso di astrazione.

Alcuni come modificare i modelli utilizzati per generare il LINQ nei controller (possiamo utilizzare MVC).

Vicino alla soluzione ideale. Hai semplicemente bisogno di avvolgere l'accesso alla vostra entità impostare in qualche codice che sarà simile:

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 volte questo è fondamentale per qualcosa chiamato repository generico, ma in realtà è solo un wrapper per EF set. Utilizzerai sempre GetQuery per interrogare l'archivio dati invece di utilizzare direttamente DbSet.

+0

Ottima risposta, grazie @Ladislav. –

+0

Ciao @Ladislav Ho problemi a visualizzare cosa dovrebbe contenere IMultitenant, hai un momento libero che potresti elaborare?Grazie :-) –

+0

In realtà solo a pensare, suppongo che IMultitenant contenga TenantId? Sono sulla buona strada? –

3

È inoltre possibile separare i dati degli inquilini in diversi database
o nello stesso database, ma con schemi diversi? Puoi leggere ulteriori informazioni a riguardo in un vecchio articolo di MSDN chiamato "Multi-Tenant Data Architecture"

+1

Grazie Oakman, sì, ho letto che in passato è un buon articolo. Al momento solo uno schema condiviso db condiviso ci adattava, ma è un link utile da elencare con questa domanda +1 da me. –

Problemi correlati