2010-10-25 12 views
8

per impostazione predefinita Entity Framework esegue la mappatura da tinyint a byte.Entity Framework: mapping tinyint su booleano

Ho provato a cambiare il tipo di fondo dopo che è stato generato per booleano, ma ottenere errore di compilazione

Mapping membro specificato non è valido. Il tipo 'Edm.Boolean [Nullable = False, DefaultValue =]' del membro blah ...

è possibile in 4.0?

Non è stata una mia idea usare la colonna minuscola come booleana. questo è stato fatto automaticamente da un altro team usando Hibernate che apparentemente fa così per la compatibilità con mysql. ovviamente tinyint ha più valori di 2. Sto cercando un modo per mapparlo in modo tale che qualsiasi accettazione per 1 sia falsa, o qualsiasi cosa accetta per 0 è vera. o funzionerebbe per me

c'è un modo per collegare un convertitore di tipi di tipi in EF?

risposta

3

Dalla pagina MSDN integer types, vediamo che il tipo tinyint rappresenta un numero intero compreso tra 0 e 255.

Un bool, al contrario, rappresenta solo un binario 0 o 1.

Modificare la mappatura predefinita byte-bool (se fosse ancora possibile, che secondo this page sembra che non è) non ha senso - come, per esempio, vuoi rappresentare il valore 42 (una valida tinyint) come bool?

Se è necessaria un'entità con una proprietà di tipo bool, è consigliabile associarla a una colonna di tipo bit.

+0

concordato. Odio quei piccoli inti sono usati per rappresentare booleano. apparentemente questo è stato fatto usando hibernate in java, e questo crea campi come tinyint per mysql compatiblity .. –

+3

Nelle lingue più vecchie qualsiasi valore diverso da 0 sono stati trattati come true e 0 è stato trattato come falso ... quindi sono parzialmente da incolpare :) – Dismissile

+3

Al contrario, ha molto senso! Se semplicemente non puoi modificare lo schema del database (per qualsiasi motivo), non hai altra scelta che modificare la mappatura. A meno che non si voglia esporre una proprietà con una semantica booleana come un intero, che è brutto. – proskor

4

In realtà, il motivo principale per cui spesso gli interi sono utilizzati nel database è dovuto al fatto che molti motori di database non consentono indici su campi di bit. La maggior parte dei motori di database tenta di raggruppare più campi bit in un byte "interno" in uno spazio sicuro. Di conseguenza, il campo bit non è realmente disponibile per l'indicizzazione.

Lo standard defacto è 0 uguale a falso e tutti gli altri valori sono uguali a true. Tuttavia EF non ha supporto per questo tipo di mappatura. Il metodo migliore consiste nell'utilizzare un campo shadow privato dichiarato come byte che viene mappato su EF. Secondo, crei una proprietà booleana alias che viene utilizzata dal tuo codice.

La mappatura delle proprietà private con EF richiede un codice di riflessione.