3
My Entity Class:
public class Building 
    {
        /// <summary>
        /// internal Id 
        /// </summary>
        public virtual long Id { get; set; }
..............
}

私のマッピング:

var model = AutoMap.AssemblyOf<Building>()
                        .Setup(s => s.FindIdentity = p => p.Name == "Id")
                        .Where(t => t.Namespace == "SpikeAutoMappings");

var database = Fluently.Configure()
                        .Database(DatabaseConfigurer)
                        .Mappings(m=>m.AutoMappings.Add(model));

単体テストを実行するとこのエラーが発生し続けるため、何が問題なのかを理解してくれる人が必要です。

Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException:  FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

 --->  FluentNHibernate.Visitors.ValidationException: The entity doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id)..
4

3 に答える 3

9

上記の両方の答えは正しいです。別の方法で指定しない限り、オートマッパーは int Id フィールドがあると想定します。
ID が長い場合、オートマッパーが正しく認識しない可能性があります。
次のように、クラスの MappingOverride を定義してみてください。

public class UserMappingOverride : IAutoMappingOverride<User>
{
    #region IAutoMappingOverride<User> Members

    public void Override(AutoMapping<User> mapping)
    {
        mapping.Id(u => u.Name);
    }

    #endregion
}

Id() 関数を使用すると、ID フィールドがどうあるべきかというオートマッパーの規則をオーバーライドできます。
オーバーライドの詳細については、http: //wiki.fluentnhibernate.org/Auto_mapping#Overrides を参照してください。
乾杯、
ジョニー

于 2011-02-21T14:45:34.267 に答える
1

一般に、フィールドはデータベース テーブルに存在する必要がAutoMappingあるため、使用は適切なポリシーではありません。代わりに、 NMGIdなどの流暢なマッピング ジェネレーターを使用してマッピングを処理することを検討してください。

この場合、最初にアプリケーションをダウンロード/インストールしてから、データベース (Oracle、SQL、およびその他のさまざまな) からマッピング ファイルを生成します。

マッピング ファイルを作成するには、まず/Entities/プロジェクト内にフォルダーを作成します。次に、ジェネレーター ソフトウェアを次のように構成します。

環境設定

  1. 生成されたプロパティ名 = データベースの列名と同じ (変更なし)
  2. マッピング スタイル = Fluent Mapping
  3. フィールドまたはプロパティ = Auto プロパティ

利用可能な言語: C# および VB

  1. フォルダ:[your project folder]\Entities
  2. 名前空間 :[your project namespace].Entities
  3. アセンブリ名:[your project name].Entities

次に、すべてを生成するか、特定のテーブルを生成します。

すべての*.csおよび*Map.csファイルがプロジェクトに作成されます (Add Existing Item...表示されない場合は、 で追加できます)。

Fluent を使用すると、次のように表示されます。

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Sequence("keyname_ID")

また

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Identity()
  .Column("keyname_ID")

また

Id(x => x.keyName_ID)
  .Column(x => x.keyname_ID)
  .GeneratedBy
  .Assigned()

そのため、 withIdを使用して指定する必要があります。これを行うには、ソリューション内の各ファイルの on コードの行を上書きする必要があります。追加するだけです:FluentMappingFluent nHibernateIdMap

Id(x => x.KeyName_ID)
  .GeneratedBy
  .GetGeneratorMapping()
  .IsSpecified("KeyName_ID");

は、作成されたものではなく、データベース内のkeyname_id列名です。id

でのマッピングには、次のBuildSessionものが必要であることに注意してください。

(...).Mappings(m => 
    m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);

そして、今Idマッピングされています。:)これが役立つことを願っています!

于 2011-02-01T12:17:58.873 に答える
0

Automapping に関する私の経験では、Entity クラスに次の行がある限り、次のようになります。

    public virtual int Id { get; private set; }

オートマッパーはこれを ID として扱いますが、プログラマーの助けは必要ありません (つまり、AutoMap 呼び出しで使用している FindIdenity コードは必要ありません)。

ID 宣言に見られる唯一の違いは、int ではなく long 型を使用していることです。これが重要かどうかはわかりません。

于 2010-03-30T22:04:09.500 に答える