gpt4 book ai didi

entity-framework - EntityFramework 可以支持 EAV 模型吗?

转载 作者:行者123 更新时间:2023-12-04 11:30:21 25 4
gpt4 key购买 nike

EntityFramework 可以支持 EAV 模型吗?这是一个可行的方案,还是一场噩梦?我想为系统使用 EAV 模型,如果可能的话,我想采用 EF,但我担心这两种理念存在冲突。

最佳答案

这取决于您希望如何在应用程序中使用 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();
}
}
}

由于转换和集合搜索,这不是很好。如果您多次访问数据,它们将被执行多次。

我没有尝试过,但我认为可以通过每个实体实现类似的接口(interface)来避免这种情况:
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();
}

现在您将处理 ObjectMaterializedSavingChanges ObjectContext 上的事件.在第一个处理程序中,您将执行 Initialize如果物化对象实现 IEavEntity在第二个处理程序中,您将迭代 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();
}
}
}
}
}

关于entity-framework - EntityFramework 可以支持 EAV 模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5497153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com