Une cartographie de données long de la propriété de type int dans la base de données
Dans tous les exemples que j'ai vu utiliser int32
s que les Identifiants. Ce n'est pas toujours pratique dans les environnements de production. Plusieurs de nos bases de données d'identité des Identifiants qui sont dans le domaine de la int64
s, de sorte que notre pratique est de toujours utiliser long
pour nos propriétés de l'ID. Toutefois, SQL Server a le plus de valeurs maximales pour la int
type de colonne.
Je suis en train de faire notre première preuve de concept avec Entity Framework, version 6. Avec le long ID
, il est impossible de mapper les objets de la base de données.
Je suis à l'aide d'API Fluent pour l'ensemble de ma cartographie. Maintenant, ça ressemble à ça pour l'ID:
Property(s => s.ID).HasColumnName("spcID");
Si j'ajoute un .HasColumnType("int")
à la fin de la ci-dessus, il me donne l'erreur suivante:
Schéma spécifié n'est pas valide. Erreurs: (7,12) : erreur 2019: Membre
Cartographie spécifié n'est pas valide. Le type
'Edm.Int64[Nullable=False,DefaultValue=]' membre 'ID' dans le type
'EFConnection."L'espace n'est pas compatible avec
"SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identité]'
de membre "spcID' en type 'CodeFirstDatabaseSchema.L'espace".
Comment avez-vous carte le type de données à une variable de type long .NET?
Modifier
Droit maintenant, j'ai un simple Test d'Intégration mis en place pour s'assurer que je peux me connecter:
[TestMethod]
public void TestMethod1() {
using (var context = new Context()) {
Assert.IsTrue(context.Spaces.Any());
Assert.IsTrue(context.Spaces.First().IsActive);
}
}
Sans .HasColumnType("int")
, la première Affirmer passe, mais j'obtiens une InvalidOperationException
sur la deuxième:
La propriété 'ID' sur 'Espace' n'a pas pu être réglé à un Système.Int32 de valeur. Vous devez définir cette propriété sur une valeur non nulle de type 'System.Int64'.
.HasColumnType(...)
? Je me souviens d'utiliser EF4 et n'a jamais utilisé la contrainte, semblait travail de cartographie fine SQL int
à C#'s long
valeurs.Veuillez voir mon montage ci-dessus.
Je ne comprends pas quel est le problème. Si vous utilisez un
int
en SQL, utiliser un int
en C#. Si vous utilisez un bigint
en SQL, utiliser un long
en C#. Ils ont tous deux contiennent la même gamme de valeur; voir Trevor de réponse.En regardant de Trevor réponse, il semble que notre convention de
int
dans la base de données et long
en C# était incorrecte. Au mieux, il est vérification future de la couche de données.Si vous tentez d'avenir, pourquoi pas à la fois être
long
/bigint
? C'est idiot d'avoir un être un int
et d'être un long
. Ce qui se passe quand vous obtenez au-dessus de la valeur qu'un int
peut tenir? Votre code s'exécute, mais se bloque lorsque vous essayez de conserver dans la base de données et que c'est un problème.OriginalL'auteur krillgar | 2013-12-27
Vous devez vous connecter pour publier un commentaire.
C# et SQL types de données sont compatibles:
Si votre table a une colonne de
bigint
utilisationpublic long Id { get; set; }
si votre colonne estint
utilisationpublic int Id { get; set; }
SQL
bigint
-9,223,372,036,854,775,808
à9,223,372,036,854,775,807
int
-2,147,483,648
à2,147,483,647
C#
long
-9,223,372,036,854,775,808
à9,223,372,036,854,775,807
int
-2,147,483,648
à2,147,483,647
Références:
pourquoi le feraient-ils? C'est un 32 bits ou 64 bits de la valeur.
OK. Cela a piqué ma curiosité au sujet de l'efficacité de mon entreprise. Peut-être les données de la couche est d'obtenir paré pour l'avenir, et, s'ils atteignent la limite dans la base de données qu'elles modifient la colonne. Je suis avec @SiLo et de la pensée qu'ils avaient différentes valeurs min/max.
dans la base de données et
long
dans la classe n'est pas l'avenir de l'épreuve du code, c'est une bombe à retardement!D'accord. Je crois que la pensée a été qu'il est facile d'exécuter une mise à jour de colonne dans la base de données, et d'avoir à déployer une nouvelle DLL est beaucoup de travail. Il n'est certainement pas une bonne pratique.
OriginalL'auteur Trevor Pilley