88

質問は本当にそれをすべて言います。デフォルトでは としてマップすることですが、 としてstringマップする必要がありintます。

PersistenceModelそれが違いを生む場合、私は現在、私の慣習を設定するために使用しています。前もって感謝します。

更新 トランクから最新バージョンのコードを取得すると、問題が解決したことがわかりました。

4

7 に答える 7

84

この規則を定義する方法は、以前は時々変更されていましたが、現在は次のようになっています。

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}
于 2009-11-10T08:48:26.267 に答える
45

したがって、前述のように、最新バージョンのFluent NHibernateをトランクから外すと、必要な場所にたどり着きました。最新のコードを使用した列挙型のマッピング例は次のとおりです。

Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));

カスタムタイプは、を使用するのではなく、列挙型のインスタンスとして処理されるように強制しますGenericEnumMapper<TEnum>

私は実際にパッチを提出して、文字列を永続化する列挙型マッパーとintを永続化する列挙型マッパーを切り替えることを検討しています。これは、慣例として設定できるはずのようです。


これは私の最近の活動に現れ、Fluent NHibernateの新しいバージョンでは、これを簡単にするために状況が変更されました。

すべての列挙型を整数としてマップするために、次のような規則を作成できます。

public class EnumConvention : IUserTypeConvention
{
    public bool Accept(IProperty target)
    {
        return target.PropertyType.IsEnum;
    }

    public void Apply(IProperty target)
    {
        target.CustomTypeIs(target.PropertyType);
    }

    public bool Accept(Type type)
    {
        return type.IsEnum;
    }
}

次に、マッピングは次のようにするだけです。

Map(quote => quote.Status);

このように、FluentNHibernateマッピングに規則を追加します。

Fluently.Configure(nHibConfig)
    .Mappings(mappingConfiguration =>
    {
        mappingConfiguration.FluentMappings
            .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
    })
    ./* other configuration */
于 2009-01-14T08:44:37.063 に答える
40

ExampleEnum? ExamplePropertynull 許容列挙型 ( など)を忘れないでください。それらは個別にチェックする必要があります。これは、新しい FNH スタイルの構成で行う方法です。

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum ||
            (x.Property.PropertyType.IsGenericType && 
             x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
             x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
            );
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}
于 2010-04-26T19:27:47.147 に答える
25

これは、列挙型プロパティを int 値でマップした方法です。

Map(x => x.Status).CustomType(typeof(Int32));

私のために働く!

于 2010-05-14T18:39:17.973 に答える
1

自動マッピングで Fluent NHibernate を使用している場合 (および潜在的に IoC コンテナー):

上記のIUserTypeConvention@ Julienの回答: https://stackoverflow.com/a/1706462/878612

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}

Fluent NHibernate Automapping 構成は、次のように構成できます。

    protected virtual ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(SetupDatabase)
            .Mappings(mappingConfiguration =>
                {
                    mappingConfiguration.AutoMappings
                        .Add(CreateAutomappings);
                }
            ).BuildSessionFactory();
    }

    protected virtual IPersistenceConfigurer SetupDatabase()
    {
        return MsSqlConfiguration.MsSql2008.UseOuterJoin()
        .ConnectionString(x => 
             x.FromConnectionStringWithKey("AppDatabase")) // In Web.config
        .ShowSql();
    }

    protected static AutoPersistenceModel CreateAutomappings()
    {
        return AutoMap.AssemblyOf<ClassInAnAssemblyToBeMapped>(
            new EntityAutomapConfiguration())
            .Conventions.Setup(c =>
                {
                    // Other IUserTypeConvention classes here
                    c.Add<EnumConvention>();
                });
    }

*その後、CreateSessionFactoryCastle Windsor などの IoC で (PersistenceFacility とインストーラーを使用して) 簡単に利用できます。*

    Kernel.Register(
        Component.For<ISessionFactory>()
            .UsingFactoryMethod(() => CreateSessionFactory()),
            Component.For<ISession>()
            .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
            .LifestylePerWebRequest() 
    );
于 2013-12-16T11:32:18.100 に答える
0

NHibernateを作成し、プロパティマップIUserTypeで使用して指定できます。CustomTypeIs<T>()

于 2009-01-13T15:57:52.693 に答える
0

DB テーブルで値を int / tinyint として保持する必要があります。列挙型をマッピングするには、マッピングを正しく指定する必要があります。以下のマッピングと列挙型のサンプルを参照してください。

マッピング クラス

public class TransactionMap : ClassMap トランザクション
{
    public TransactionMap()
    {
        //その他のマッピング
        .....
        //列挙型のマッピング
        Map(x => x.Status, "Status").CustomType();

        Table("トランザクション");
    }
}

列挙型

public enum TransactionStatus
{
   待機中 = 1、
   処理済み = 2、
   ロールバック = 3、
   ブロックされた = 4、
   返金済み = 5、
   処理済み = 6、
}
于 2014-04-24T15:41:36.153 に答える