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 int32s 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 int64s, 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'.

Cela fonctionne sans .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