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. AgensGraph可以支持HA吗?
- 3. ExtJS GridPanel可以支持列组吗?
- 4. Hibernate Validator ValidationMessages.properties可以支持UTF-8吗?
- 5. Android可以支持dp小于1dp吗?
- 6. Windows 2016 Standard可以支持Rancher吗?
- 7. EF4可以支持批量更新吗?
- 8. Emacs可以支持项目吗?
- 9. 可以cuda 8.0支持Geforce 940mx吗?
- 10. Windows Phone 8.1可以支持ViewportControl吗?
- 11. 可以wkhtml2pdf支持CSS计数器吗?
- 12. Arm-cortexA53可以支持OpenCL吗?
- 13. DataObjects.NET可以支持SQL标识列吗?
- 14. 关系模型vs EAV
- 15. C#我可以从EntityFramework扩展IdentityMessage吗?
- 16. 可以QuickGraph支持这些要求吗? (包括数据库持久性支持)
- 17. ASP.Net MVC支持Editor.For(模型)
- 18. 我可以将非持久性字段添加到模型吗?
- 19. 我可以向客户指出支持SPNEGO但NTLM不支持HTTP请求吗?
- 20. mac os 10.5.8可以支持任何支持iphone os 4.0的xcode版本吗?
- 21. 可以定制PMD以完全支持新语言吗?
- 22. EntityFramework模型的通用Getter
- 23. 使用NHibernate的EAV数据模型
- 24. 我在哪里可以找到创建EAV模型的SQL语句?
- 25. 我可以使用atk4模型吗?
- 26. 模型可以观察视图吗?
- 27. ng模型可以替换ID吗?
- 28. 你可以通过RedirectToAction模型吗?
- 29. 我可以依靠模板类型吗?
- 30. 模型可以刷新视图吗?