5

私は、次の列挙型があります:私はNHibernateはを使用してデータベースにこのタイプのインスタンスを永続化したいFluentのNHibernateからのAutoMappingがenum型を無視するのはなぜですか?

public class X 
{ 
    public virtual int? Id { get; set; } 

    public virtual EnumType EnumProperty { get; set; } 

    public virtual string S { get; set; } 
} 

:以下のクラスで使用

public enum EnumType 
{ 
    E1, 
    E2 
} 

を。そして、定型的なコードを書くことを避けるために、私は次のように自動マッピング機能を使用しようとしている:

MyAutoMappingConfigurationはこのようになります
private ISessionFactory CreateSessionFactory() 
{ 
    var mappings = AutoMap 
     .AssemblyOf<Domain.X>(new MyAutoMappingConfiguration()); 

    this.NHibernateConfiguration = Fluently 
     .Configure() 
     .Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2012.ConnectionString(
       b => b.FromConnectionStringWithKey("x"))) 
     .Mappings(m => m.AutoMappings.Add(mappings)) 
     .BuildConfiguration(); 

    return this.NHibernateConfiguration.BuildSessionFactory(); 
} 

:私は作成するには、この設定から生成されたスキーマを使用する場合

public class MyAutoMappingConfiguration: FluentNHibernate.Automapping.DefaultAutomappingConfiguration 
{ 
    public override bool ShouldMap(Type type) 
    { 
     return type.Namespace == "Domain"; 
    } 

    public override bool IsComponent(Type type) 
    { 
     return type.Name == "EnumType"; 
    } 
} 

データベース:

new SchemaExport(this.sessionProvider.NHibernateConfiguration) 
    .Execute(true, true, false); 

次のスクリプトが生成され、実行されている:

if exists (select * from dbo.sysobjects where id = object_id(N'[X]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [X] 

create table [X] (
    Id INT not null, 
    S NVARCHAR(255) null, 
    primary key (Id) 
) 

なぜEnumPropertyは無視されますか? (等価思える)

私はXのための明示的なマッピングを追加したり、このような自動マッピングのためオーバーライド:

var mappings = AutoMap 
    .AssemblyOf<Domain.X>(new MyAutoMappingConfiguration()) 
    .Override<Domain.X>(m => 
    { 
     m.Table("X"); 
     m.Id(x => x.Id); 
     m.Map(x => x.EnumProperty);  // this works 
     m.Map(x => x.S); 
    }); 

スクリプトが正しく生成されます。

if exists (select * from dbo.sysobjects where id = object_id(N'[X]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [X] 

create table [X] (
    Id INT not null, 
    EnumProperty NVARCHAR(255) null, 
    S NVARCHAR(255) null, 
    primary key (Id) 
) 

このショーは提示されたenumを正しくマップするNHibernateの能力には何も問題はないようです。なぜこれに自動マッピングできないのですか?


私はMyAutoMappingConfigurationに次のメソッドを追加する場合:

public override bool ShouldMap(Member member) 
{ 
    var result = base.ShouldMap(member); 
    return result; 
} 

とブレークポイントを置いて、resultは何とか後に無視されますEnumPropertyメンバー、のためtrueです。

+0

(ビットカウンタ - 直感的です)何らかの理由で、オートマッピングを使用すると、デフォルトで無効になっているようです。 https://groups.google.com/forum/#!topic/fluent-nhibernate/NJo0FiWXEwY – Najera

+0

@Najera [DeJaVoの回答](http://stackoverflow.com/a/34714996/2642204)の下の私のコメントを参照してください。 – BartoszKP

+0

mehodが実行されると、空ですが、デリゲートが実行されていますか?はいの場合、あなたの財産は評価されますか? – Najera

答えて

2

私の経験では、列挙型はボックスからマップされているため、何も特別なことはしません(カスタムタイプやコンポーネントなし)。だから、

、二つの問題があります

  • IsComponent問題の列挙型がコンポーネントであることを示すべきではありません。

    public override bool IsComponent(Type type) 
    { 
        return base.IsComponent(type); 
    } 
    

    (または単にすべてで実装を削除)

  • ShouldMapは、列挙を明示的にマッピングする必要があることを示すべきではありません。それはプロパティなので、とにかくマップされます。ですから、例えば:列挙型が同じ名前空間にある場合は、あなたの場合は

    public override bool ShouldMap(Member member) 
    { 
        return base.ShouldMap(member) && member.CanWrite && 
          !member.MemberInfo.IsDefined(typeof(NotMappedAttribute), false); 
    } 
    

    、あなたが実行する必要があります。

    public override bool ShouldMap(Type type) 
    { 
        return type.Namespace == "Domain" 
         && !type.IsEnum; 
    } 
    

+0

あなたが私にしたいことは不明です。 Enumをマップする必要があるので、なぜ '!type.IsEnum'を入れますか?あなたが話しているメンバーですか、「ShouldMap」と入力していますか?とにかくあなたが望む答えを自由に編集してください。 –

+2

はい、「地図」は、そのプロパティではなく、エンティティ全体のコンテキストでのみ使用する必要があります。これが私のアプローチの主な問題でした。あなたの答えを編集して、それを説明しました。十分ではないと感じたら、修正してください。再度、感謝します! – BartoszKP

関連する問題