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?
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.
Utiliser une API fluide
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Node>().Property(x => x.ID).HasDefaultValueSql("NEWID()");
}
Définissez la valeur SQL par défaut du champ sur 'newsequentialid ()' dans la configuration de mappage.
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.
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);