Soporte de anotación de datos de Entity Framework 7 para [DatabaseGenerated (DatabaseGeneratedOption.Identity)] en una clave principal de tipo Guid

entity-framework-core

Pregunta

Tengo una clase base de entidad que utilizo para la base de todas mis entidades:

    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; }
}

Sin embargo, no parece que [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

tiene algún efecto

La migración creada tiene en el método CreateTable como el siguiente:

    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; }
}

esto debería ser:

    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; }
}

¿ [DatabaseGenerated(DatabaseGeneratedOption.Identity)] ya no se admite en el marco de entidades 7? ¿O me estoy perdiendo algo?

Respuesta aceptada

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] es compatible con EF7.

Debido a que EF7 se dirige a varios proveedores de bases de datos, la forma en que se almacena en la migración ha cambiado. Dado que no todos los proveedores admiten columnas de identidad, no hay ningún parámetro de identity . En su lugar, se almacena como una anotación específica del proveedor. Por lo tanto, verá la siguiente sintaxis cuando una columna se utilizará como columna de IDENTITY específica del servidor SQL.

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

El significado semántico de DatabaseGeneratedOption.Identity es el mismo que antes. La base de datos generará un valor cuando se agregue una nueva fila. Cuando se dirige a SQL-Server, si se especifica en cualquiera de las propiedades de tipo entero, EF7 creará una columna de identidad para él. Como IDENTITY no puede especificarse en tipos no enteros o no numéricos, para cualquier otro tipo no habrá ninguna anotación de este tipo. Aunque la propiedad todavía tiene la característica de que agregar una nueva fila generará un valor.

En su ejemplo, la propiedad es de tipo Guid que se traduce en uniqueidentifier tipo de uniqueidentifier en SQL-Server. Este tipo no se puede establecer IDENTITY tanto, no se encuentran anotaciones en la migración generada. Si intenta agregar un registro sin especificar un valor, la base de datos generará un valor para usted. Si establece explícitamente el valor en la propiedad, el Id EF7 utilizará ese valor y lo propagará a la base de datos. Ese sería el efecto esperado de la anotación.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué