使用Fluent NHibernate映射一个简单的元素集合

时间:2010-01-15 18:20:51

标签: fluent-nhibernate nhibernate-mapping collections

我正在尝试使用Fluent NHibernate映射枚举值的集合。

IList<EnumType> lst;

我找不到任何关于它的文档,但我确信它应该是可能的。 映射一组实体时,我完全没有问题。

谢谢, 莱昂纳多

2 个答案:

答案 0 :(得分:4)

您可以使用以下FNH映射签名来映射简单值类型集合。

HasMany(x => x.Collection)
    .Table("TableName")
    .KeyColumn("KeyColumnName")
    .Element("ValueColumnName");

其中:

  • 集合:值类型的集合(可以是enum,因为它将被映射为int)。
  • TableName:将存储集合值的表的名称。
  • KeyColumnName:将键值存储回父级的列的名称。
  • ValueColumnName:将存储实际值的列的名称。

让我们看一个如何映射一些值类型集合的例子。

public enum EnumType
{
    Value1,
    Value2,
    Value3
}

public class Entity
{
    /// <summary>
    /// Primary key
    /// </summary>
    public virtual int Id { get; set; }

    /// <summary>
    /// Collection of strings
    /// </summary>
    public virtual IList<string> StringCollection { get; set; }

    /// <summary>
    /// Collection of enums
    /// </summary>
    public virtual IList<EnumType> EnumCollection { get; set; }

    /// <summary>
    /// Collection of dates/times
    /// </summary>
    public virtual IList<DateTime> DateTimeCollection { get; set; }
}

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        // Map primary key.
        Id(x => x.Id);

        // Map value collections
        HasMany(x => x.StringCollection)
            .Table("Entity_String")
            .KeyColumn("EntityId")
            .Element("String");

        HasMany(x => x.EnumCollection)
            .Table("Entity_Enum")
            .KeyColumn("EntityId")
            .Element("Enum");

        HasMany(x => x.DateTimeCollection)
            .Table("Entity_DateTime")
            .KeyColumn("EntityId")
            .Element("DateTime");
    }
}

此映射的结果将生成四(4)个表。

  1. 表实体,其中一列ID为int。
  2. 具有两列的表Entity_String - EntityId:int,String:varchar,以及外键EntityId到Entity表Id列。
  3. ...同样,除了列是int类型。
  4. ...同样,除了列是datetime类型。

答案 1 :(得分:1)

HasMany(x =&gt; x.Items)     。表( “TBL”)     .KeyColumn( “FK”)     .Element( “ECOL”)     .AsBag()