gpt4 book ai didi

nhibernate - 将 NHibernate 与 EAV 数据模型一起使用

转载 作者:行者123 更新时间:2023-12-03 20:59:25 25 4
gpt4 key购买 nike

我正在尝试利用 NH 映射到一个数据模型,该模型是对 EAV/CR 数据模型的松散解释。

我有大部分工作,但正在努力映射 Entity.Attributes 集合。

以下是相关表格:

--------------------
| Entities |
--------------------
| EntityId PK |-|
| EntityType | |
-------------------- |
-------------
|
V
--------------------
| EntityAttributes | ------------------ ---------------------------
-------------------- | Attributes | | StringAttributes |
| EntityId PK,FK | ------------------ ---------------------------
| AttributeId FK | -> | AttributeId PK | -> | StringAttributeId PK,FK |
| AttributeValue | | AttributeType | | AttributeName |
-------------------- ------------------ ---------------------------

AttributeValue 列是作为 sql_variant 列实现的,我已经为它实现了一个 NHibernate.UserTypes.IUserType。

我可以创建一个 EntityAttribute 实体并直接保留它,以便部分层次结构正常工作。

我只是不确定如何将 EntityAttributes 集合映射到 Entity 实体。

请注意,对于给定的 EntityId/AttributeId 组合,EntityAttributes 表可以(并且确实)包含多行:
EntityId AttributeId AttributeValue
-------- ----------- --------------
1 1 Blue
1 1 Green

对于此示例,StringAttributes 行如下所示:
StringAttributeId AttributeName
----------------- --------------
1 FavoriteColor

如何有效地将此数据模型映射到我的实体域,以便 Entity.Attributes("FavoriteColors") 返回最喜欢的颜色集合?输入为 System.String?

最佳答案

开始

class Entity
{
public virtual int Id { get; set; }

internal protected virtual ICollection<EntityAttribute> AttributesInternal { get; set; }

public IEnumerable<T> Attributes<T>(string attributeName)
{
return AttributesInternal
.Where(x => x.Attribute.Name == attributeName)
.Select(x => x.Value)
.Cast<T>();
}
}

class EntityAttribute
{
public virtual Attribute Attribute { get; set; }

public virtual object Value { get; set; }
}

class EntityMap : ClassMap<Entity>
{
public EntityMap()
{
HasMany(e => e.AttributesInternal)
.Table("EntityAttributes")
.KeyColumn("EntityId")
// EntityAttribute cant be an Entity because there is no real Primary Key
// (EntityId, [AttributeId] is not unique)
.Component(c =>
{
c.References(ea => ea.Attribute, "AttributeId").Not.LazyLoad();
c.Map(ea => ea.Value, "AttributeValue").CustomType<VariantUserType>();
});
}
}

关于nhibernate - 将 NHibernate 与 EAV 数据模型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784547/

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