Fluent NHibernate/フルーエントマッピング/列挙型

提供: MonoBook
ナビゲーションに移動 検索に移動

Fluent NHibernateMySQLの組み合わせでは、C#の列挙型は文字列扱いとなる。

エンティティ[編集 | ソースを編集]

// 列挙型
public enum Level
{
    User = 1,
    PowerUser,
    Administrator,
    God,
}

// エンティティ
public class User
{
    public virtual long Id { get; protected set; }
    public virtual Level Level { get; set; }
}

マッピング[編集 | ソースを編集]

//

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();

        Map(x => x.Level);
    }
}

スキーマ[編集 | ソースを編集]

CREATE TABLE User (
  Id bigint(20) NOT NULL AUTO_INCREMENT,
  Level varchar(255) DEFAULT NULL,
  PRIMARY KEY (Id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

備考[編集 | ソースを編集]

列挙型の範囲外の値を指定してもエラーにはならず、数字が文字列として格納される。 範囲内の物については、列挙型の各名称が文字列として格納される。

using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    // Level列挙型は1~4までだが、0と5を指定してみる。
    // エラーにはならない。
    for (int i = 0; i <= 5; i++)
    {
        var user = new User();
        user.Level = (Level)i;
        session.SaveOrUpdate(user);
    }
    transaction.Commit();
}
+----+---------------+
| Id | Level         |
+----+---------------+
|  1 | 0             |
|  2 | User          |
|  3 | PowerUser     |
|  4 | Administrator |
|  5 | God           |
|  6 | 5             |
+----+---------------+

解決策[編集 | ソースを編集]

知らん。


関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]


外部リンク[編集 | ソースを編集]