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. 模型可以刷新視圖嗎?