2012-02-25 10 views
6

Attualmente stiamo sviluppando un prodotto utilizzando Code First Entity Framework e Mysql. Il database di sviluppo è ospitato in un ambiente Windows mentre il mysql di produzione è su Linux.Entity Framework con mysql, problema di Capitalizzazione delle tabelle tra linux e windows

L'edizione che sto funzionando in è che le tabelle in MySQL sono chiamati in questo modo:

mydatabase.industry 
mydatabase.account 
... 

Entity Framework crea una query come questa:

Select * FROM mydatabase.Industry; 

Avviso la lettera maiuscola. Funziona bene su mysql in Windows, ma su Linux ho questo errore:

Table 'mydatabase.Industry' doesn't exist 

Qualche idea?

+0

Perché non si fa a cambiare il nome della tabella configurata in minuscolo? Il nome della tabella SQL e il nome dell'entità sono configurabili in modo indipendente. – usr

+0

Intendi cambiare il nome dell'entità in minuscolo? Quindi, invece di una classe C# "Industria" avrei una "industria" di classe? – AFrieze

+0

Nessuno dei due è diverso. Puoi avere il nome della tabella xyz mappato all'entità Abc. – usr

risposta

6

Entity Framework utilizzerà lo stesso nome (maiuscole e minuscole) come dichiarato per l'oggetto. Così, per esempio, se si dichiara un oggetto del modello come:

public class Industry 
{ 
    public int IndustryID { get; set; } 
} 

Entity Framework cercherà una tabella di industria con una colonna di IndustryID.

È possibile modificare questo aggiungendo annotazioni ai modelli. Effettuare le seguenti operazioni:

[Table("industry")] 
public class Industry 
{ 
    public int IndustryID { get; set; } 
} 

In questo modo, gli oggetti saranno ancora utilizzare lo schema di denominazione NET del caso, ma sarà abbinare il vostro database corrispondente. Puoi anche cambiare il nome del colunn usando .

In alternativa, è possibile modificare i nomi delle tabelle in MySQL.

+0

questo funziona, e penso che sia quello che usr stava arrivando. – AFrieze

+0

@AFrieze - Credo che tu abbia ragione. Felice di poterti aiutare. Grazie per aver accettato. – JasCav

1

Ecco la mia risposta preso dai commenti:

usr: Perché non si cambia il nome della tabella configurata in minuscolo? Il nome della tabella SQL e il nome dell'entità sono configurabili in modo indipendente.

AFrieze: Intendi cambiare il nome dell'entità in minuscolo? Quindi invece di una classe C# "Industria" avrei una "industria" di classe?

usr: No, i due sono diversi. È possibile associare il nome tabella xyz all'entità Abc . - solo adesso edit

3

Entity framework creates a query like this:

Select * FROM mydatabase.Industry; Notice the capitalized letter. This works fine on mysql in Windows, but on Linux I get this error:

Table 'mydatabase.Industry' doesn't exist Any Ideas?

Questo non ha nulla a che fare con l'entità stessa.
È una variante della classica configurazione di default diversa su due diversi problemi del sistema operativo.

La soluzione potrebbe non essere più necessario, ma ecco il motivo per il vostro problema:

MySQL memorizza le tabelle come file.
E MySQL è stato originariamente sviluppato su Linux, dove i nomi dei file e quindi i nomi delle tabelle erano sensibili al maiuscolo/minuscolo (poiché la maggior parte dei filesystem di Linux sono case-sensitive).

Quindi MySQL è stato portato su Windows, in cui il filesystem non fa distinzione tra maiuscole e minuscole.
Su Windows, il file system non fa distinzione tra maiuscole e minuscole e quindi non è in grado di distinguere i file maiuscoli & inferiori.
Per risolvere i problemi risultanti, è necessario aggiungere l'opzione per ignorare il caso dei nomi delle tabelle.

Quindi è stata creata la variabile di configurazione case-sensivity dell'identificatore "lower_case_table_names", con la quale è possibile modificare tali impostazioni.

Ulteriori informazioni sui valori possibili [0, 1, 2] qui: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

In Windows, è possibile configurare nel file my.ini, che si trova all'interno o intorno:

C:\Program Files\MySQL\MySQL Server X.Y 

, a seconda della versione in esecuzione. Se non trovi l'impostazione, puoi aggiungerla alla fine del file my.ini.

Su Linux, questo file di configurazione si trova in genere /etc/my.cnf o /etc/mysql/my.cnf ma che possono essere diversi a seconda dei vari Linux-dristributions e versioni di distribuzione.

Così l'impostazione predefinita per questo valore è

on Linux: Case-Senstivie 
on Windows: Case-Insensitive 

Pertanto, entità-quadro SQL generato, che è stato generato da un modello con opere di rivestimento sbagliate su Windows, ma non su Linux.

Tutto quello che dovete fare è cambiare il valore di lower_case_table_names su Linux in 1 nel file my.cnf in modo che sia anche case-insensitive.

Si noti che sebbene si possa anche rendere MySQL su Windows sensibile al maiuscolo/minuscolo, questa non è una buona idea.

Quindi, ricordarsi di riavviare il servizio MySQL/mysqld prima di testare se funziona o meno.

In tutti i casi, ricordarsi sempre di controllare se funziona anche su Linux, poiché il comportamento di MySQL non è sempre identico su questi due sistemi.

Il motivo per i diversi valori predefiniti è che su Linux si ottiene una prestazione più elevata quando si è in modalità case-sensitive, perché in tal caso non è sempre necessario utilizzare i nomi in lettere minuscole. In Windows invece, avere una configurazione senza distinzione tra maiuscole e minuscole è migliore, perché non è possibile avere due file con lo stesso nome che differiscono solo nella custodia nella stessa cartella. Ciò porterebbe a malfunzionamenti. Quindi il default è senza distinzione tra maiuscole e minuscole in Windows.

Incidentially, questo è il motivo per cui le prestazioni di MySQL su Linux è migliore della performance su Windows (tra le altre cose, come una migliore programmazione e più veloce IO/filesystem su Linux)

Si noti che è anche possibile modificare il caso -sensitity di query (confronto string) facendo

CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_cs; 

o

CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_ci; 

rispettivamente

0.123.

E si può anche impostare maiuscole e minuscole su una singola tabella, come questo

DROP TABLE IF EXISTS single_test_table; 
CREATE TABLE single_test_table(
    single_test_id int unsigned NOT NULL auto_increment, 
    ... 

    PRIMARY KEY PK_single_test_id (single_test_id), 
    ... 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_cs; 
+0

potresti guardare questo problema simile e fornire il tuo feedback. http://stackoverflow.com/questions/40509997/error-when-reading-asp-net-membership-tables-in-mysql - grazie. – Mostafa

Problemi correlati