4

概要:

Fluent NHibernate Automapper を使用して、名前が同じで名前空間が異なる 2 つのクラスを保存したい

環境

テストのために、さまざまなオブジェクトをデータベースにインポートする必要があると書いています。最終的には、マッパーを適切なモデルに書き込みます。

コード生成と Fluent NHibernate を使用して、これらの DTO を取得し、直接 db にダンプしています。

例外は言う (auto-import="false" を使用してみてください)

コード

public class ClassConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Namespace.Replace(".", "_"));
    }
}

namespace Sample.Models.Test1
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string Something { get; set; }
    }
}

namespace Sample.Models.Test2
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string SomethingElse { get; set; }        
    }
}

そして、これが実際のアプリコードです

            var model = AutoMap.AssemblyOf<Service1>()
                .Where(t => t.Namespace.StartsWith("Sample.Models"))
                .Conventions.AddFromAssemblyOf<Service1>();
            var cfg = Fluently.Configure()
                .Database(
                MySQLConfiguration.Standard.ConnectionString(
                    c => c.Is("database=test;server=localhost;user id=root;Password=;")))
                .Mappings(m => m.AutoMappings.Add(model))
                .BuildConfiguration();
            new SchemaExport(cfg).Execute(false, true, false);

ありがとうございました

Fluent Nhibernate RC1 を使用した更新

4

6 に答える 6

7

(AutoMappings とは対照的に) FluentMappings の規約を使用してこれを機能させることができませんでした。ただし、必要に応じて各 ClassMap に追加する必要がありますが、以下は私にとってはうまくいきます。

public class AMap : ClassMap<A> 
{
    public AMap()
    {
        HibernateMapping.Not.AutoImport();
        Map(x => x.Item, "item");
        ...
    }
}
于 2011-05-23T15:44:22.550 に答える
7

James Gregory によるfluent-nhibernate フォーラムのソリューション

今夜はこれをちゃんと見ようと思った。基本的に、それは前述の例外である AutoImport のものにかかっています。NHibernate に最初のマッピングが与えられると、エンティティが完全なアセンブリ修飾名で命名されていることがわかり、短い名前のインポートが作成されます (便利です!)。衝突します。したがって、解決策は自動インポートをオフにすることです。残念ながら、RC でそれを行う方法はありません... 規則でこれを変更する機能を追加する修正をコミットしました。したがって、最新のバイナリまたはソースを入手した場合は、添付されたプロジェクトの Conventions 行を変更して、これを行うことができるはずです。

.Conventions.Setup(x =>  {   
  x.AddFromAssemblyOf<Program>();   
  x.Add(AutoImport.Never());  }); 

これにより、アセンブリで定義したすべての規則が追加され、ヘルパー規則の 1 つを使用して自動インポートがオフになります。

于 2009-08-19T07:35:56.933 に答える
0

私も同じ問題を抱えています。私はそれを次のように解決しました:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(...)
            .AdoNetBatchSize(500))
        .Mappings(m => m.FluentMappings
            .Conventions.Setup(x => x.Add(AutoImport.Never()))
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...))
        ;

インポートされたパーツは次のとおり.Conventions.Setup(x => x.Add(AutoImport.Never()))です。この構成ではすべてが正常に機能しているようです。

于 2011-04-29T07:59:00.793 に答える
0

これには本当に問題があり、上記の例またはその変形のいずれも役に立ちません。

var cfg = 新しい NotifyFluentNhibernateConfiguration();

    return Fluently.Configure()
      .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
            .ConnectionString("Server=10.2.65.227\\SOSDBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=test;Trusted_Connection=False;")
      )

      .Mappings(m => {
          m.AutoMappings
            .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg));
          m.FluentMappings.Conventions.Setup(x =>
          {
              x.AddFromAssemblyOf<Program>();
              x.Add(AutoImport.Never());
          });
      } )

      .BuildSessionFactory();

プログラムの参照が見つかりません..

また、別のxmlファイルを必死の構成に流暢なnhibernateのauto-import = falseへのマッピングに配置しようとしましたが、成功しませんでした。

これを行う方法について、より広範な例を教えてください。

編集、数週間前に最新のトランクを入手しました。

編集、すべての重複を削除することでこれを解決しました。

于 2010-07-27T08:13:40.673 に答える
0

.HBM XML ファイルのオブジェクト表現にアクセスするには、 BeforeBindMappingイベントを使用します。

このイベントにより、NHibernate セッション ファクトリが作成される前に、実行時に任意のプロパティを変更できます。これにより、FluentNHibernate と同等の規則も不要になります。残念ながら、現在のところ、この非常に優れた機能に関する公式ドキュメントはありません。

重複マッピングの問題に対するグローバルな解決策を次に示します (すべての HQL クエリで、クラス名だけでなく、完全修飾型名を使用する必要があることに注意してください)。

var configuration = new NHibernate.Cfg.Configuration();

configuration.BeforeBindMapping += (sender, args) => args.Mapping.autoimport = false;
于 2012-05-15T22:57:16.963 に答える
0

規則 AutoImport.Never() を追加する場所をいじる必要がありました。パーシスタンス マッピングをさまざまなプロジェクトに分けています。各アプリケーションのモデルもさまざまなプロジェクトで見つけることができます。Fluent NHibernate と自動マッピングで使用します。

ドメイン、まあマッピングを実際に組み合わせる必要がある場合があります。これは、すべてのドメインにアクセスする必要がある場合です。上記の例のように、使用される POCO クラスは同じ名前で異なる名前空間を持つ場合があります。

すべてのマッピングを結合する方法は次のとおりです。

internal static class NHIbernateUtility
{
    public static ISessionFactory CreateSessionFactory(string connectionString)
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration
                    .MsSql2008
                    .ConnectionString(connectionString))
            .Mappings(m => m.AutoMappings
                .Add(ProjectA.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectB.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectC.NHibernate.PersistenceMapper.CreatePersistenceModel())).BuildSessionFactory();
    }
}

そして、持続性マッパーの 1 つ:

public static class PersistenceMapper
{
    public static AutoPersistenceModel CreatePersistenceModel()
    {
        return
            AutoMap.AssemblyOf<Credential>(new AutoMapConfiguration())
                .IgnoreBase<BaseEntity>()
                .Conventions.Add(AutoImport.Never())
                .Conventions.Add<TableNameConvention>()
                .Conventions.Add<StandardForeignKeyConvention>()
                .Conventions.Add<CascadeAllConvention>()
                .Conventions.Add<StandardManyToManyTableNameConvention>()
                .Conventions.Add<PropertyConvention>();
    }
}

持続性マッパーは、POCO 名前空間ごとに非常に似ています。一部のマッパーにはオーバーライドがあります。各永続マッパーに .Conventions.Add(AutoImport.Never()) を追加する必要があり、それは魅力のように機能します。

他の誰かがこのようにやっているなら、これを共有したかっただけです.

于 2014-01-16T10:27:12.657 に答える