web-dev-qa-db-fra.com

Entity Framework génération automatique GUID

Je suis nouveau à EF alors voici. J'ai une classe qui contient les éléments suivants

public class EmailTemplate
{
    public Guid Id { get; set; }

    [MaxLength(2000)]
    public string Html { get; set; }
}

Voici ma classe de cartographie

class EmailMapper : EntityTypeConfiguration<EmailTemplate>
    {
        public EmailMapper()
        {
            ToTable("EmailTemplate");

            HasKey(c => c.Id);
            Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(c => c.Id).IsRequired();
        }
    }

J'essaie d'appeler DbContext.SaveChanges(), mais j'obtiens l'erreur suivante:

Détails des exceptions: System.Data.SqlClient.SqlException: impossible d'insérer la valeur NULL dans la colonne 'Id', table 'AutoSendConnection.dbo.EmailTemplates'; La colonne n'autorise pas les valeurs NULL. INSERT échoue.

Qu'est-ce que je fais mal? Pourquoi EF ne crée-t-il pas automatiquement un GUID unique?

22
user2859298

Décorez simplement le champ Id de votre classe EmailTemplate comme ci-dessous et SQL Server générera automatiquement la valeur lors de l'insertion.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public Guid Id { get; set; }

Vous pouvez également supprimer votre classe Mapper car elle n'est plus nécessaire.

41
Mark

Utiliser une API fluide

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Node>().Property(x => x.ID).HasDefaultValueSql("NEWID()");
}
12
Mohsen Tabareh

Définissez la valeur SQL par défaut du champ sur 'newsequentialid ()' dans la configuration de mappage. 

3
Liviu M.

Vous pouvez également définir la valeur par défaut de ID en tant que NewID () dans Sql Server lui-même et transmettre le GUID en tant que null.

Je le faisais dans SSMS.

2
Moons

Je préfère quitter la base de données pour générer automatiquement l'ID, par exemple le schéma suivant:

CREATE TABLE [dbo].[MyTable](
    [MyId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Booking_BookingId]  DEFAULT (newsequentialid())
    )

Ensuite, dans le premier mappage de code, je spécifie ce qui suit pour indiquer à Entity Framework que la base de données se chargera de générer la valeur lors de l'insertion.

Property(a => a.MyId).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
0
John