2012-01-17 9 views
7

Sto provando a fare qualcosa che dovrebbe essere relativamente facile, ma non so come costruirlo.Entity Framework 4.1 - Override Entity (DBSet) con filtro

Ho un'entità generata che vorrei sovrascrivere aggiungendo un'istruzione Linq Where.

Con la presente il parziale per il contesto:

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    }  
    public DbSet<Assignee> Assignees { get; set; } 
} 

Ho creato un nuovo parziale di MyEntities e provato la seguente

public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return this.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

ma questo genera un errore di ambiguità (che è ovvio).

Come posso realizzare questo?

Grazie

risposta

10

Prova esponendo DbSet<Assignee> e IQueryable<Assignee> con nomi diversi

public partial class MyEntities: DbContext 
{ 
    public MyEntities() 
     : base("name=MyEntities") 
    { 
    } 

    public DbSet<Assignee> AssigneesSet { get; set; } 

    public IQueryable<Assignee> Assignees 
    { 
     get 
     { 
      return AssigneesSet.Where(z => z.IsActive == true); 
     } 
    } 
} 
+0

Questo sembra il più logico ... Non so se questo funzionerà anche se EF continuerà a generare DbSet pubblico Assignees {get; impostato; } e non verrà usato quando si chiama context.Assignees? – Fox

+0

@Fox Quindi è possibile modificare manualmente il nome o assegnare un nome diverso per la proprietà 'IQueryable '. – Eranga

+0

Bello, funziona perfettamente.Ho appena impostato il DbSet protetto per esporre solo una proprietà da DbContext per intellisense pourpose;) –

2
public override DbSet<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
    set; 
} 

questo quello che vuoi?

+0

Non riesco a farlo perché non sto ereditando da MyEntities ... Ereditato da DbContext – Fox

+1

Perché non si crea una classe che eredita dal codice generato e sovrascrive il comportamento della proprietà? – linkerro

+0

Troppe modifiche al codice .. devo cambiare un sacco di codice nel mio DAL ... buona idea anche se – Fox

2

Avete provato ad aggiungere una condizione alla mappatura tabella nel vostro modello? Fai clic con il tasto destro sull'entità in edmx e seleziona "Mappatura tabella". Quindi "Aggiungi una condizione". Probabilmente una soluzione più elegante.

+0

Il problema con questo approccio è che EF non consente di aggiungere filtri per le proprietà mappate. In questo esempio, dovrebbe rimuovere la colonna IsActive dalla mappatura, il che significa che EF non salverà le modifiche nel campo IsActive. Ho battuto la testa contro la mia scrivania per ore cercando di aggirarlo, ma senza successo. – demius

0

È buona norma creare classi di repository in una cartella DAL (utilizzare il nome desiderato). Quindi fai i filtri lì. Ecco un tutorial di Microsoft per questo:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

A seconda della condizione che si desidera non è possibile mettere su EF condizione di mappatura, qui è il motivo: http://entityframework.codeplex.com/workitem/48

0

So che questo è super vecchio, ma un altro modo semplice ed elegante, senza cambiare tutti i nomi esistenti, sta utilizzando la parola chiave new per nascondere il membro originale, in questo modo:

public new IQueryable<Assignee> Assignees 
{ 
    get 
    { 
     return base.Assignees.Where(z => z.IsActive == true); 
    } 
} 

Volevo solo condividere per eventuali futuri visitatori, spero che aiuti!