Supporto dell'annotazione dati di Entity Framework 7 per [DatabaseGenerated (DatabaseGeneratedOption.Identity)] Su un tipo di guida Chiave primaria

entity-framework-core

Domanda

Ho una classe base di entità che uso per la base di tutte le mie entità:

    public abstract class EntityBase : IEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id
    {
        get
        {
            return _id;
        }

        set
        {
            if (_id.Equals(default(Guid)))
                _id = value;

            if (_id.Equals(value))
                return;

            throw new InvalidOperationException("Primary Keys cannot be changed.");
        }
    }
    Guid _id = default(Guid);

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

Tuttavia non sembra che [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

ha qualche effetto

La migrazione creata ha il metodo CreateTable come il seguente:

columns: table => new
            {
                Id = table.Column<Guid>(nullable: false),...

questo dovrebbe essere:

Id = c.Guid(nullable: false, identity: true),...

è [DatabaseGenerated(DatabaseGeneratedOption.Identity)] non è più supportato nell'entità framework 7? O mi sta sfuggendo qualcosa?

Risposta accettata

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] è supportato in EF7.

A causa degli obiettivi di EF7, vari provider di database hanno cambiato il modo in cui è memorizzato nella migrazione. Poiché non tutti i provider supportano le colonne di identità, non esiste alcun parametro di identity . Invece è memorizzato come annotazione specifica del fornitore. Quindi vedrai la seguente sintassi quando una colonna verrà utilizzata come colonna IDENTITY specifica per SQL Server.

     Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),

Il significato semantico di DatabaseGeneratedOption.Identity è lo stesso di prima. Il database genererà un valore quando viene aggiunta una nuova riga. Quando si punta a SQL Server, se è specificato su una qualsiasi delle proprietà di tipo intero, EF7 creerà la colonna Identità per esso. Poiché IDENTITY non può essere specificato su tipi non interi o non numerici, per qualsiasi altro tipo non ci sarà alcuna annotazione di questo tipo. Sebbene la proprietà abbia ancora funzionalità che aggiungendo una nuova riga genererà un valore.

Nel tuo esempio la proprietà è di tipo Guid che traduce in tipo uniqueidentifier in SQL-Server. Questo tipo non può essere impostato IDENTITY quindi non è stata trovata alcuna annotazione nella migrazione generata. Se si tenta di aggiungere un record senza specificare il valore, il database genererà un valore per te. Se si imposta in modo esplicito un valore per la proprietà, Id EF7 utilizzerà tale valore e lo propagherà al database. Questo sarebbe l'effetto previsto dell'annotazione.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché