2010-05-06 21 views
15

EAV/CR veri modelinin gevşek bir yorumu olan bir veri modelini eşlemek için NH'yi kullanıyorum.Bir EAV veri modeli ile NHibernate'i kullanma

Çoğunlukla çalışıyorum ama Entity.Attributes koleksiyonunu eşleştirmekle uğraşıyorum. İşte

Söz konusu tablolar şunlardır:

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

attributeValue sütunu bir sql_variant sütun olarak uygulanır ve bunun için bir NHibernate.UserTypes.IUserType uyguladık.

Bir EntityAttribute varlığı oluşturabilir ve hiyerarşinin bir kısmının çalışmasını sağlamak için doğrudan doğruya devam edebilirim.

EntityAttributes koleksiyonunun Varlık varlığına nasıl eşleneceğinden emin değilim.

Not EntityAttributes tablo olabilir (ve) Verilen ENTITYID/Attributeıd kombinasyonu için birden fazla satır içerir:

StringAttributes satır bu örnek için şuna benzer

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

:

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

Ben nasıl Bu veri modelini Entity etki alanımla, Entity.Attributes ("FavoriteColors") favori renk koleksiyonları döndürecek şekilde etkin bir şekilde eşleştirin? System.String olarak yazılmıştır?

+0

gider? –

+0

Öznitelikleri öznitelik değerlerine göre bulmayı planlıyorsanız, sql_variant'ın düzgün çalışıp çalışmadığından emin değilim. Bunu denemelisin. –

cevap

1

burada akıcı kullanıyor musunuz

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>(); 
      }); 
    } 
} 
İlgili konular