一千萬個為什麽

搜索

我正在嘗試利用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實體。

請註意,EntityAttributes表可以(並且確實)包含給定EntityId/AttributeId組合的多個行:

EntityId AttributeId AttributeValue
-------- ----------- --------------
1        1           Blue
1        1           Green

對於此示例,StringAttributes行如下所示:

StringAttributeId AttributeName
----------------- --------------
1                 FavoriteColor

如何有效地將此數據模型映射到我的Entity域,以便Entity.Attributes(“FavoriteColors”)返回喜歡的顏色集合?輸入為System.String?

最佳答案

開始

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

    internal protected virtual ICollection AttributesInternal { get; set; }

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

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

    public virtual object Value { get; set; }
}

class EntityMap : ClassMap
{
    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();
            });
    }
}

轉載註明原文: 使用NHibernate和EAV數據模型

猜你喜歡