¿Puede EntityFramework admitir un modelo de EAV? ¿Es esto un escenario factible o una pesadilla? Quiero usar un modelo de EAV para un sistema, y me gustaría abrazar a EF si es posible, pero me preocupa que estas dos filosofías estén en conflicto.¿Puede EntityFramework admitir un modelo de EAV?
Respuesta
Depende de cómo esperas usar EAV en la aplicación. EF se puede utilizar para mapear esto:
public partial class Entity
{
// Key
public virtual int Id { get; set; }
// Other common properties
// Attributes
public virtual ICollection<EavAttriubte> Attributes { get; set; }
}
// The simplest implementation
public class EavAttribute
{
// Key
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Value { get; set; }
}
Esto es lo que puede ser persistido y lo que puede ser consultada por entidades LINQ a. Ahora puede hacer que su entidad se pueda utilizar definiendo propiedades de ayuda (se puede usar solo en su aplicación, pero no por persistencia o consultas). Estas propiedades auxiliares se pueden utilizar solamente para los atributos conocidos que siempre existe para el tipo de entidad - atributos opcionales deben ser todavía accesibles en la colección:
public partial class Entity
{
// Just example without error handling
public decimal Price
{
get
{
return Int32.Parse(Attributes.Single(a => a.Name == "Price"));
}
set
{
Attributes.Single(a => a.Name == "Price").Value = value.ToString();
}
}
}
Esto no es muy agradable debido a las conversiones y la búsqueda de la colección. Si accede a los datos varias veces, se ejecutarán varias veces.
yo no probado, pero creo que esto puede evitarse mediante la implementación de una interfaz similar por cada entidad:
public interface IEavEntity
{
// loads attribute values from Attributes collection to local fields
// => conversion will be done only once
void Initialize();
// saves local values back to Attributes collection
void Finalize();
}
Ahora va a manejar ObjectMaterialized
y SavingChanges
eventos en ObjectContext
. En el primer controlador, ejecutará Initialize
si el objeto materializado implementa IEavEntity
en el segundo controlador iterará ObjectStateManager
para obtener todas las entidades actualizadas o insertadas que implementen IEavEntity
y ejecutará Finalize
. Algo como:
public void OnMaterialized(object sender, ObjectMaterializedEventArgs e)
{
var entity = e.Entity as IEavEntity;
if (entity != null)
{
entity.Initialize();
}
}
public void SavingChanges(object sender, EventArgs e)
{
var context = sender as ObjectContext;
if (context != null)
{
foreach (var entry in context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship)
{
var entity = entry.Entity as IEavEntity;
if (entity != null)
{
entity.Finalize();
}
}
}
}
}
- 1. ¿Debo usar el modelo EAV?
- 2. Uso de NHibernate con un modelo de datos EAV
- 3. EAV sobre SQL Server
- 4. Controlador genérico de API web para admitir cualquier modelo
- 5. ¿Puede IIS Express admitir proxies inversos?
- 6. ¿Puede un modelo "belongs_to" cualquiera o más de un modelo?
- 7. Alternativas a Entity-Attribute-Value (EAV)?
- 8. Modelo de datos de encuesta: ¿cómo evitar el EAV y la desnormalización excesiva?
- 9. acceso CanCan `puede` método de un modelo
- 10. Diseño de la base de datos: ¿EAV o no a EAV?
- 11. ¿Puede el REPL de ocaml admitir autocompletado, etc.?
- 12. ¿Funciona EntityFramework contra Access 2007 db (.accdb)?
- 13. EntityFramework EntityCollection Observando CollectionChanged
- 14. MVC4 ExtendedMembershipProvider y entityframework
- 15. EntityFramework no crea tablas
- 16. ¿Se puede pasar un modelo con RedirectToAction?
- 17. ¿Matriz, EAV, LOB serializado para campos personalizados?
- 18. Migrar de DataSets a EntityFramework
- 19. Linq to EntityFramework DateTime
- 20. ¿Puede el cocos2d admitir la textura 4096x4096 en Ipad3?
- 21. Error al cargar EntityFramework 4.3.1
- 22. EntityFramework cómo sobrescribir las propiedades
- 23. EntityFramework - Error de proxy de la entidad
- 24. ¿Se puede llamar a un método de otro modelo en un modelo en Code Igniter?
- 25. Asignación de identificadores a entidades con EntityFramework 4
- 26. ¿Cómo configuro TeamCity para admitir un modelo de solicitud de extracción de GitHub para integraciones de código fuente?
- 27. EntityFramework 4, DbSet y ObjectContext
- 28. EntityFramework usando el nombre de tabla incorrecto
- 29. Cuándo admitir Windows 64?
- 30. Migración de EntityFramework parámetro de cascadaDelete