2013-04-04 7 views
5

Ho un progetto che utilizza l'ultima versione di EF CF con PostgreSQL e Npgsql.Integrazione di Npgsql con Entity Framework Code First

Il mio modello si presenta come:

[Table("mytable")] 
public class MyTable 
{ 
    [Column("id")] 
    public int Id { get; set; } 
    [Column("mycolumn")] 
    public string MyColumn { get; set; } 
} 

e il database/tabelle/colonne ha minuscoli nomi come:

CREATE TABLE mytable 
{ 
    id serial, 
    mycolumn character(50) 
} 

Il Npgsql genera i comandi SQL tra virgolette quindi devo usare l'Annotazioni dati a causa delle caratteristiche di PostgreSQL, la strega è fastidiosa. Tuttavia, non vorrei usare le citazioni dei nomi delimitati nel database.

C'è un modo per configurare Npgsql affinché non includa virgolette quando si generano comandi o si impongono nomi di tabelle/colonne in lettere minuscole nell'SQL generato?

+0

Darei un'occhiata a quello. –

+1

Ciao Francisco, in EF6 è possibile utilizzare le convenzioni per i nomi di tabelle e colonne in lettere minuscole, invece di aggiungere un attributo a ciascuno, quindi non preoccuparti di questa domanda. :) –

+0

Utilizzo delle convenzioni di codice. Fortunatamente, quando Postgres vede che il nome della colonna è tutto in minuscolo, ignora le virgolette doppie (quindi continuiamo a piegare il caso al momento dell'interrogazione), ma sarebbe comunque bello sapere come disattivare il doublequoting. – jhexp

risposta

8

Se non mi manca qualcosa, vorresti un modo generico of changing the naming convention for tables?

L'EF6 ha la caratteristica custom conventions - è ancora versione ufficiale, ma se funziona per voi, alcuni link ...

http://entityframework.codeplex.com/wikipage?title=Custom%20Conventions

Nel tuo caso, si avrebbe per la sua attuazione per la classe/Type Immagino - es (Alcuni pseudo codice) ...

1) implementare IConfigurationConvention<Type, EntityTypeConfiguration> (è possibile controllare la sorgente di EF per EntityConventionBase)

2) Nella Apply - modificare come i nomi delle tabelle vengono generati tramite configurazione (ToTable()) - per qualcosa come .ToLowerCase()

3) aggiungere alle convenzioni ...

per esempio ...

public class SmallCapsEntitiesConfigurationConvention 
    : IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    public void Apply(Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     configuration().ToTable(memberInfo.Name.ToLowerInvariant(), null); 
    } 
} 

Potete vedere un esempio qui
http://blog.cincura.net/233167-custom-conventions-in-entity-framework-6-helping-firebird/

In caso contrario, non ho idea di Npgsql/PostgreSQL - lo ha fatto sembrare un po 'crudo' a me. Ma puoi gestirlo dal lato EF.

+0

È un bel modo per risolvere il mio problema! Tuttavia l'EF6 non viene rilasciato come stabile e non posso usare questa versione sulla mia azienda. Ma terrò questo a mente comunque. –

+2

Conosco @ MaxBündchen - ma quello è il meglio che si possa pensare - a corto di soluzioni sul lato PostgreSQL – NSGaga

+1

Ehi, ho lo stesso problema ... ed EF6 è ora disponibile! : D – matrixugly