La mejor manera de manejar la concurrencia optimista con Entity Framework 7

asp.net-core entity-framework-core

Pregunta

Estoy usando ASP.NET 5 rc1 y Entity 7 rc1 sobre coreclr con un proyecto de código de proyecto de primera migración.

Estaba examinando cómo administrar la concurrencia en las entidades, pero no pude encontrar ninguna buena información actualizada sobre las prácticas de manejo de concurrencia recomendadas para la Entidad 7.

Tengo algunas entidades, todas implementan la interfaz:

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

como por ejemplo en:

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

En lugar de agregar el atributo [Timestamp] a cada columna RowVersion, prefiero usar la configuración fluida, por lo que en mi DbContext especifico para cada entidad que quiero que esa columna se maneje como la versión de fila.

Sin embargo, la Entidad 7 no parece admitir más la opción .IsRowVersion() pero tiene la opción IsConcurrencyToken() , que debería ser suficiente, pero en las primeras migraciones de código genera una columna varbinary que IsConcurrencyToken() y al insertar / actualizar filas no se incrementa automáticamente .

Me pregunto si lo mejor que se puede hacer es administrar explícitamente la versión de cada fila aumentando la versión al actualizar o insertar entidades en la base de datos. Este es mi DbContext

public interface IVersionedModel
{
    byte [] RowVersion { get; set; }
}

Básicamente mi pregunta es, ¿cómo manejar la concurrencia con ASP.NET 5 y Entity 7? Es la primera vez que trato con esto y cualquier sugerencia será apreciada.

ACTUALIZACIÓN : Gracias al enlace https://stackoverflow.com/users/1922568/joe-audette siempre que encontré algunas respuestas, desafortunadamente no todas

Según http://docs.efproject.net/en/latest/modeling/concurrency.html#how-concurrency-tokens-work-in-ef parece que podemos usar la anotación Timestamp si queremos versionar una fila o una anotación ConcurrencyCheck en una propiedad si queremos una versión basada en una propiedad (no toda la fila).

La API fluida solo permite configurar el token de concurrencia utilizando .IsConcurrencyToken()

No he encontrado todavía una forma a través de la API fluida para versionar toda la fila con una columna dedicada (sería bueno si la API fluida permitiera una .IsRowVersion() , pero no es así)

Respuesta popular

He creado una clase estática para manejar esta y otras características faltantes de ModelBuilder EF7 ( usar con precaución , no probadas en un entorno de producción)

public static class SqlServerModelBuilderExtensions
{
    public static PropertyBuilder<decimal?> HasPrecision(this PropertyBuilder<decimal?> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<decimal> HasPrecision(this PropertyBuilder<decimal> builder, int precision, int scale)
    {
        return builder.HasColumnType($"decimal({precision},{scale})");
    }

    public static PropertyBuilder<byte[]> IsRowVersion(this PropertyBuilder<byte[]> builder)
    {
        return builder.HasColumnType("rowversion").IsConcurrencyToken().ValueGeneratedOnAdd();
    }
}



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é