Entity Framework Code First Migrations: Définir La Clé Primaire De La Valeur

J'ai une table qui stocke des données supplémentaires pour certaines lignes d'une table:

public class QuoteExtra
{
    [Key]
    public int QuoteId { get; set; }
    //More fields here
}

J'aimerais être en mesure d'ajouter des lignes à cette table où je définir explicitement le PK.

Si je la laisse comme ci-dessus, la définition de la valeur et de soumettre les causes de la ligne de la valeur à être supprimée et remplacée par la valeur auto-générée à partir de la base de données (et de la colonne est définie comme une colonne d'Identité dans le schéma).

Cela semble être la bonne solution:

public class QuoteExtra
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int QuoteId { get; set; }
    //More fields here
}

Cependant cela me met à l'exception:

Impossible d'insérer une valeur explicite pour l'identité de la colonne dans la table 'EnumTest" quand IDENTITY_INSERT est réglé sur OFF.

Alors, comment puis-je écrire ma classe alors que je suis en mesure de définir la valeur d'une Clé Primaire en EF?

Edit:

J'ai essayé d'ajouter le Code suivant à base de Migration de set IDENTITY_INSERT SUR:

public override void Up()
{
    Sql("SET IDENTITY_INSERT QuoteExtra ON");
}

J'ai couru et a essayé de nouveau, mais j'ai reçu la même réserve que ci-dessus. Ce qui est étrange, c'est la base de données ne reflètent ce paramètre, et l'exécution de SQL contre directement ne me permettent d'insérer des valeurs arbitraires pour la clé primaire - donc, il semblerait Cadre de l'Entité elle-même est l'application de cette règle, et en négligeant de reconnaître que IDENTITY_INSERT n'est pas en fait la valeur off. Dois-je besoin de le mettre quelque part en EF lui-même?

Edit 2:

J'ai mal compris IDENTITY_INSERT; j'ai supposé que le réglage une fois à gauche pour que le tableau indéfiniment. En fait, il vit aussi longtemps que la "Session", ce qui signifie que par exemple mettre une Migration signifie qu'il vit... tant que la Migration s'exécute, et n'a aucune incidence sur les futures connexions comme ma plus tard .Ajouter() avec EF, ce qui explique pourquoi j'ai toujours cette exception - le DB est vraiment la source de l'exception, pas de EF. Depuis IDENTITY_INSERT est limitée à au plus une table par session c'est un assez inefficace façon de le faire - ne pas créer une Identité PK colonne, en premier lieu, semble être une meilleure voie.

  • Que voulez-vous dire par Ce qui est étrange, c'est la base de données ne reflètent ce paramètre?
  • Ce que je voulais dire, c'est que j'ai réussi à insérer des valeurs, si j'ai utilisé SQL brut à le faire après l'exécution de la identity_insert sur commande, mais maintenant je vois pourquoi - c'est parce que le paramètre est activé pour la durée d'une session, et en raw SQL dans Sql Server Management Studio, j'ai séjourné à l'intérieur de la durée d'une session, alors que mon EF migration et suivants du code de test sont des sessions séparées.
  • Oui. L'identité insertion est lié à la connexion. Si vous assurer que votre code est en cours d'exécution dans la même connexion, vous devriez être en mesure de l'utiliser. Mais c'est en quelque sorte la magie noire, surtout en tenant compte des migrations.