2011-06-20 4 views
3

私は識別子としてIdという名前のプロパティを自動的にマッピングするmy idの規約を持っています。要件が満たされているので、私はドメインモデルを微調整する必要があるので、私はオンラインで行って、IAutoMappingOverride<T>から継承するクラスを作成する必要があることを発見しました。自動マッピング規則はマッピングオーバーライドで機能しますか?

マイ大会:

public class PrimaryKeyConvention : IIdConvention, IIdConventionAcceptance 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     instance.Column("Id"); 
     instance.GeneratedBy.SeqHiLo(instance.Name, "10"); 
    } 

    public void Accept(IAcceptanceCriteria<IIdentityInspector> criteria) 
    { 
     criteria.Expect(x => x.Generator, Is.Not.Set); 
    } 
} 

マイオーバーライド:

public class LocateMappingOverride : IAutoMappingOverride<Locate> 
{ 
    public void Override(AutoMapping<Locate> mapping) 
    { 
     mapping.Map(x => x.SendTo).Not.Nullable(); 
    } 
} 

予想通り、私は私のオーバーライドを削除する場合は、通常は作業を行います。

例外はThe entity 'LocateMappingOverride' doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id).です。

マッピングオーバーライドと組み合わせて表記法を使用することはできますか?

+1

コードでNhibernate 3.2の組み込みマッピングを検討したいことがあります。 – Newbie

答えて

2

答えは - はい、オートマッピングはオーバーライドで動作します。

エラーの内容を見てください。問題はLocateエンティティではなく、LocateMappingOverrideエンティティであり、そのクラスはもちろんエンティティとして扱われるべきではありません。エンティティとして扱うためにFluentNHibernateのルールにLocateMappingOverrideが含まれるように、IAutomappingConfigurationが設定されている必要があります。そして実際にマップされたIDは持っていません。

次のことを行う必要があり、次のいずれか

  • 変更あなたのIAutomappingConfigurationのでIAutoMappingOverride<>を実装するクラスは
  • 移動エンティティ
  • またはそのすべての一般的なマーカーインターフェイスを導入するために検索される範囲外のオーバーライドを除外されていることエンティティは実装する必要があります。つまり、IEntityと変更してIAutomappingConfigurationのルールをそれぞれ使用します。
+0

Woah。あなたは、絶対に正しい。私はそれを完全に見落とした。どうもありがとうございました。 – gcso

+0

+1同じ問題を解決するために、ドメインアセンブリを自動マッピングするときにwhere句を追加しました。 '.Where(t =>!t.GetInterfaces()。Where(i => i.IsGenericType).Any(i => i.GetGenericTypeDefinition()== typeof(IAutoMappingOverride <>))) ' – KevD

関連する問題