2010-10-25 5 views
8

par défaut Entity Framework mappe tinyint en octet.Entity Framework: mappage de tinyint en booléen

i essayé de changer le type sous-jacent après qu'il a été généré pour booléenne, mais devient erreur de compilation

Mapping membre spécifié est incorrect. Le type 'Edm.Boolean [Nullable = False, DefaultValue =]' du membre bla ...

est-ce possible dans 4.0?

ce n'était pas mon idée d'utiliser la colonne tinyint comme booléen. ceci a été fait automatiquement par une autre équipe utilisant hibernate qui le fait apparemment pour la compatibilité mysql. De toute évidence, tinyint a plus de valeurs que 2. Je cherche un moyen de le mapper de sorte que anyting accepte pour 1 est faux, ou quelque chose accepte pour 0 est vrai. soit fonctionnerait pour moi

Y at-il un moyen de brancher un traducteur de type de sortes dans EF?

Répondre

3

A partir de la page de MSDN sur integer types, nous voyons que le type tinyint représente un nombre entier allant de 0 à 255.

A bool, en revanche, ne représente qu'une 0 ou 1 binaire.

Modification du mappage par défaut byte-bool (si elle était même possible, ce qui, selon this page il semble que ce n'est pas) n'a pas de sens - comment, par exemple, seriez-vous représenter la valeur 42 (un tinyint valide) en tant que bool?

Si vous avez besoin d'une entité avec une propriété de type bool, je suggère de le mapper à une colonne de type bit.

+0

convenu. Je déteste que les minuscules sont utilisés pour représenter les booléens. apparemment cela a été fait en utilisant hibernate dans java, et cela crée des champs comme tinyint pour la compatibilité mysql .. –

+3

Dans les langues plus anciennes, toute valeur autre que 0 a été traitée comme vraie et 0 a été traitée comme fausse ... donc ils sont partiellement à blâmer :) – Dismissile

+3

Bien au contraire, ça fait beaucoup de sens! Si vous ne pouvez tout simplement pas modifier le schéma de la base de données (pour quelque raison que ce soit), alors vous n'avez pas d'autre choix que d'ajuster le mappage. Sauf si vous voulez exposer une propriété avec une sémantique booléenne comme un entier, ce qui est moche. – proskor

4

En fait, la raison principale pour laquelle les entiers sont souvent utilisés dans la base de données est due au fait que beaucoup de moteurs de bases de données n'autorisent pas les index sur les champs de bits. La plupart des moteurs de bases de données essaient de regrouper plusieurs champs de bits dans un octet «interne» en espace sécurisé. En conséquence, le champ de bits n'est pas vraiment disponible pour l'indexation.

La norme de facto est que 0 est égal à faux et toutes les autres valeurs égales à vrai. Cependant, EF ne prend pas en charge ce type de mappage. La meilleure méthode consiste à utiliser un champ d'ombre privé déclaré comme octet qui est mappé à EF. Deuxièmement, vous créez une propriété alias boolean qui est utilisée par votre code.

Le mappage de propriétés privées avec EF nécessite un code de réflexion.

Questions connexes