c# - Cómo generar todas mis entidades compuso dos tablas para cada entidad a través de una automatización T4
.net entity-framework (2)
Tengo un proyecto de biblioteca de clases para una capa de acceso a datos que utiliza Entity Framework 4. Mi proyecto necesita un concepto de control de versiones. Mi base de datos contiene muchas tablas que contienen «Id» y «CreationDateTime». Cada tabla está asociada con una tabla de versión que contiene el detalle. Todas las tablas se construyen de la misma manera y tienen el sufijo de «Versión» para la tabla de versiones.
Busco una forma de generar todas mis entidades (modelos EF4) a través de una automatización T4 que unificaría Table y TableVersion (para la versión específica) en una entidad.
Esta entidad unificada debe admitir las operaciones de obtención, inserción, actualización y eliminación.
¿Es posible hacerlo modificando una de las plantillas T4? Si es así, ¿cómo?
Muchas gracias por los punteros.
Las plantillas T4 pueden generar interfaz y atributos para "marcar" sus entidades. Después de eso, puede crear clases genéricas para proporcionar políticas coherentes o comportamientos contra sus entidades.
Tu pregunta es muy interesante. Intentaré crear un ejemplo para su caso utilizando las plantillas T4 en https://entityinterfacegenerator.codeplex.com
Probablemente no sea lo que está buscando, pero puede consultar esta publicación del blog en la que hice una prueba de concepto similar para la base de datos de registro de versiones / diario. No he usado T4 (por eso creo que probablemente esto no es lo que está buscando, pero es posible que no encuentre una mejor solución) y las entidades generadas, pero heredó todas las entidades de una entidad base que tenía propiedades de control de versiones. Básicamente, extendí DbContext anulando el método SaveChanges y configuré mis propiedades de versión allí:
foreach (var entry in this.ChangeTracker.Entries())
{
// Make sure that this customized save changes executes only for entities that
// inherit from our base entity (IEntity)
var entity = (entry.Entity as JEntity);
if (entity == null) continue;
switch (entry.State)
{
// In case entity is added, we need to set OriginalId AFTER it was saved to
// database, as Id is generated by database and cannot be known in advance.
// That is why we save reference to this object into insertedList and update
// original id after object was saved.
case System.Data.EntityState.Added:
entity.UserCreated = user;
entity.DateCreated = now;
insertedList.Add(entity);
break;
// Deleted entity should only be marked as deleted.
case System.Data.EntityState.Deleted:
if (!entity.IsActive(now))
{
invalidList.Add(entity);
continue;
}
entry.Reload();
entity.DateDeleted = now;
entity.UserDeleted = user;
break;
case System.Data.EntityState.Detached:
break;
case System.Data.EntityState.Modified:
if (!entity.IsActive(now))
{
invalidList.Add(entity);
continue;
}
entity.UserCreated = user;
entity.DateCreated = now;
JEntity newVersion = this.Set(entity.GetType()).Create(entity.GetType()) as JEntity;
newVersion = this.Set(entity.GetType()).Add(newVersion) as JEntity;
this.Entry(newVersion).CurrentValues.SetValues(entity);
this.Entry(entity).Reload();
entity.DateDeleted = newVersion.DateCreated;
entity.UserDeleted = user;
break;
case System.Data.EntityState.Unchanged:
break;
default:
break;
}
}
El enlace para el código fuente completo en github está en el artículo.
Esta solución usa la misma tabla para las versiones actuales y anteriores de la entidad, y estoy planeando mejorar este concepto al tratar de colocar todas las versiones "eliminadas" de las entidades en una tabla separada, que sería privada en DbContext, y toda la lógica para la transferencia de Los elementos a la historia estarían en guardar cambios. De ese modo, dbset público expuesto contendría solo las versiones actuales del elemento, permitiendo que cualquier solución genérica similar a datos dinámicos se construya sobre dicho contexto.