EntityFramework可以支持EAV模型吗?这是一个可行的场景,还是一场噩梦?我想为系统使用EAV模型,如果可能的话,我想拥抱EF,但是我担心这两个哲学是冲突的。EntityFramework可以支持EAV模型吗?
6
A
回答
9
这取决于您如何期望在应用程序中使用EAV。 EF可用于映射:
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; }
}
这是什么可以被持久化以及Linq-to-entities可以查询什么。现在,您可以通过定义帮助属性来使您的实体可用(只能在您的应用程序中使用,而不能通过持久性或查询)。
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();
}
}
}
这是不是很好,因为转换和收集搜索的:可选属性必须在集合中还访问 - 这些辅助属性只能用于众所周知的属性,这将永远存在实体类型使用。如果您多次访问数据,它们将被多次执行。
我没有尝试过,但我认为这可以通过实现每个实体类似的界面来避免:
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();
}
现在,您将处理在ObjectContext
ObjectMaterialized
和SavingChanges
事件。在第一个处理程序中,如果物化对象在第二个处理程序中执行IEavEntity
,则将执行Initialize
,您将迭代ObjectStateManager
以获取实施IEavEntity
的所有更新或插入实体,并执行Finalize
。例如:
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. nhibernate/orm支持eav吗?
- 2. 可以Struts支持HTML5吗?
- 3. AgensGraph可以支持HA吗?
- 4. 我可以从指定的迁移中解码EntityFramework模型吗?
- 5. IIS Express支持web园林模型吗?
- 6. Arm-cortexA53可以支持OpenCL吗?
- 7. ExtJS GridPanel可以支持列组吗?
- 8. Hibernate Validator ValidationMessages.properties可以支持UTF-8吗?
- 9. EF4可以支持批量更新吗?
- 10. Android可以支持dp小于1dp吗?
- 11. Delphi XE4可以支持iOS 4.x吗?
- 12. Windows Phone 8.1可以支持ViewportControl吗?
- 13. 可以cuda 8.0支持Geforce 940mx吗?
- 14. 可以wkhtml2pdf支持CSS计数器吗?
- 15. Emacs可以支持项目吗?
- 16. Windows 2016 Standard可以支持Rancher吗?
- 17. MX51可以支持USB 3.0吗?
- 18. XmlSerializer可以支持循环引用吗?
- 19. DataObjects.NET可以支持SQL标识列吗?
- 20. 关系模型vs EAV
- 21. Can Django 1.4可以在模板中支持elif吗?
- 22. iOS支持双模BLE吗?
- 23. C#我可以从EntityFramework扩展IdentityMessage吗?
- 24. 可以QuickGraph支持这些要求吗? (包括数据库持久性支持)
- 25. SVN可以做这个分支模型吗?
- 26. PhoneGap支持FlexBox模型
- 27. ASP.Net MVC支持Editor.For(模型)
- 28. ng模式可以保持条件吗?
- 29. 我可以将非持久性字段添加到模型吗?
- 30. Entityframework 7是否支持Oracle 12