2012-10-04 4 views
7

J'utilise le code EF en premier dans mon projet et le problème de visage lorsque les données avec ID personnalisé est en cours d'insertion.Code-First Entity Framework insertion de données avec ID personnalisé

Lorsque j'essaie d'insérer des données avec un ID personnalisé (par exemple 999), EF l'ignore et insère l'ID incrémenté dans la table.

Mon modèle:

public class Address 
{ 
     [Key] 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
... 
} 

Comment résoudre ce probleb?

EDIT:

1) Comment commencer à incrémenter de N, mais pas de 0?

2) Si je ne spécifie pas d'ID personnalisé, DB doit être incrémenté et inséré propre. Si je spécifie un ID personnalisé, DB doit l'insérer. C'est possible?

+0

Voulez-vous supprimer la fonction d'auto-incrémentation de votre table dans son ensemble? –

+0

Non, je ne le fais pas. Si je ne spécifie pas d'ID personnalisé, DB doit être incrémenté et inséré propre. Si je spécifie un ID personnalisé, DB doit l'insérer. C'est possible? Est-il possible de commencer à incrémenter à partir de N, mais pas de 0? –

Répondre

19

vous pouvez utiliser l'attribut suivant

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 

sur la clé de votre classe ou en utilisant fluentAPI

modelBuilder.Entity<Address>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
+1

Merci pour la réponse. Est-il possible d'utiliser DatabaseGeneratedOption.Identity et d'insérer un ID personnalisé? –

+0

Non car cela indiquerait à EF que vous voulez que la base de données génère l'ID pour vous et EF ignorera consciencieusement toute valeur que vous avez définie sur ce champ. – JTMon

+0

Clairement, merci –

0

Il est en fait dans le OnModelCreating dans la classe DbContext. Vous pouvez configurer un numéro de séquence. pour commencer et incrementBy comme vous voulez en ajoutant ce qui suit dans le DbContext class S'il vous plaît voir ici par exemple: https://ef.readthedocs.io/en/staging/modeling/relational/sequences.html

class MyContext : DbContext 
    { 
     public DbSet<Order> Orders { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared") 
       .StartsAt(1000) 
       .IncrementsBy(5); 

      //Once a sequence is introduced, you can use it to generate values for properties in your model. For example, you can use Default Values to insert the next value from the sequence. 
      modelBuilder.Entity<Order>() 
       .Property(o => o.OrderNo) 
       .HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers"); 
     } 
    } 
Questions connexes