39 votes

utiliser Guid comme PK avec EF4 Code First

J'ai cette classe et cette table :

public class Foo
{
public Guid Id {get;set;}
public string Name {get;set;}   
}

create table Foo
(
id uniqueidentifier primary KEY DEFAULT (newsequentialid()),
name nvarchar(255)
)

Le problème est que lorsque j'essaie d'enregistrer de nouveaux foo, le premier est associé à l'identifiant 0000-000-00 ... et le second également, ce qui entraîne une exception de contrainte.

Quelqu'un connaît-il une solution ?

71voto

Devart Points 52715

Avez-vous défini l'identité StoreGeneratedPattern ?
Vous pouvez le faire dans le OnModelCreating méthode :

modelBuilder.Entity<Foo>().Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

ou en utilisant les attributs DataAnnotation :

public class Foo {
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public Guid Id {get;set;}
  public string Name {get;set;}
}

16voto

Manatherin Points 2685

En m'appuyant sur la solution de Devart, j'ai rencontré ce problème et j'ai utilisé la fonction

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

n'a pas fonctionné. La raison en est que j'ai utilisé (comme suggéré dans l'un des tutoriels de code first) une base de données SqlServerCompact qui ne supporte pas le Guid comme identité. J'ai juste pensé que je posterais ici au cas où quelqu'un d'autre aurait ce problème. Si vous changez la chaîne de connexion pour qu'elle crée une base de données SqlServer mdf au lieu d'une base de données Compact, cela fonctionne parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X