5

enum流暢なNHibernateでのマッピングに問題があります。私はこの質問が何度も聞かれたことを知っていますが、私のために働く解決策を見つけることができませんでした。私はNHibernateの初心者ですが、単純で愚かなことを見逃したようです。これが私のコードです。

public class DBPublication
{
    public virtual int pub_id { get; set; }
    public virtual PublicationStatuses status { get; set; }
    ...
}

public enum PublicationStatuses 
{
    on_moderation,
    active,
    ...
}


public class DBPublicationMap : ClassMap<DBPublication>
{
    public DBPublicationMap()
    {
        Table("content.publications");
        Id(x => x.pub_id).GeneratedBy.Sequence("content.pub_sq");           
        Map(x => x.status);
        ...
    }
}

postgres列挙型

CREATE TYPE content.enum_publication_status AS ENUM('on_moderation', 'active', ...);

しかし、私が保存しようとすると、postgresはこれをスローします

column "status" is of type content.enum_publication_status but expression is of type text

なにか提案を?

4

3 に答える 3

7

これは、列挙型フィールドを格納するようにnhibernateを構成するための作業サンプルです。

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

    public virtual SomeEnum EnumField { get; set; }
}

public enum SomeEnum
{
    Value1,
    Value2
}

class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Id(x => x.id).GeneratedBy.Native();
        Map(x => x.EnumField);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var factory = Fluently.Configure().Mappings(x => x.FluentMappings.AddFromAssemblyOf<Entity>())
                                .ExposeConfiguration(config => new SchemaExport(config).Create(false, true))
                                .Database(MsSqlConfiguration.MsSql2008.ConnectionString("Data Source=.;Initial Catalog=nhtest;Integrated Security=True"))
                                .BuildSessionFactory();
        using (var session = factory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var entity = new Entity();
                entity.EnumField = SomeEnum.Value2;
                session.Save(entity);
                transaction.Commit();
            }
        }

    }
}

このような場合、データベースに文字列として保存されます。整数として保存する場合は、Enumフィールドプロパティのマッピングを次のように変更する必要があります。

Map(x => x.EnumField).CustomType<int>();
于 2012-10-05T08:02:51.850 に答える
1

なぜ進行中の列挙型を作成しているのですか?これはメンテナンスの悪夢ではありませんか?構成はどのように見えますか?ここで説明されている規則をすでに使用してみましたか?単純なキャストエラーのように見えるので、マッピング内でCustomType()/ CustomSQLType()を使用することを検討してください。

于 2012-10-04T12:49:06.820 に答える
0

このクラスをプロジェクトに追加するだけです。

public class PgEnumMapper<T> : NHibernate.Type.EnumStringType<T>
{
   public override NHibernate.SqlTypes.SqlType SqlType
   {
      get { return new NHibernate.SqlTypes.SqlType(System.Data.DbType.Object); }
   }
}

次に、次を使用できます。

Map(x => x.status).CustomType<PgEnumMapper<PublicationStatuses>>();
于 2014-01-05T23:19:12.803 に答える