2012-02-02 6 views
7

私は現在、次のようになります流暢Nの休止サブクラスのマッピングを作成しています:Fluent Nhibernate Table-Per-Subclass戦略を使用する場合、ID列を指定できますか?

Test.TaskRepositoryTest.DeleteTest: 
NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'Task_id'. 

それはイドためです:

public class TaskDownloadMap: SubclassMap<TaskDownload> 
{ 
    public TaskDownloadMap() 
    { 
     Table("TasksDownload"); 

     Map(x => x.ExtraProperty1, "ExtraProperty1") 
      .Nullable(); 

     Map(x => x.ExtraProperty2, "ExtraProperty2") 
      .Nullable(); 
    } 
} 

私がしようとすると、これらのエンティティのいずれかを保存するI例外を取得私のサブクラスのテーブルに設定されている列は "TaskId"という名前です。 nhibernateが使用しようとしているデフォルトの命名方式を上書きするものがありますか?私はサブクラスの "Id"列を指定する能力を持っていないようだし、誰かがそれについて話すことさえできない。これらは、2つの異なるテーブルですので、私は表・パー・サブクラス戦略つもりです前に私が言ったように

public class TaskMap: ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("Tasks"); 

     Id(x => x.Id, "Id") 
      .GeneratedBy.Identity(); 

     . 
     . 
     . 

    } 
} 

親のマッピングは次のようになります。 TasksDownloadテーブルのキーを「Task_id」に変更することはできますが、私は自分の命名規則に従うことができるように、マッピングで「TaskId」を指定することができます。

+0

あなたの階層のように見えるされてどのように?親マッピングを投稿できますか? – nemesv

+0

親のマッピングを持つ投稿を編集しました。 –

答えて

4

流行のAPIでSubclass IDを設定することはできません。組み込みのマッピングコンベンションによって処理されるためです。しかし、カスタムconventionを書くことができます(必要に応じてacceptanceを追加してください)。
サンプル溶液:

public class JoinedSubclassIdConvention : IJoinedSubclassConvention, 
    IJoinedSubclassConventionAcceptance 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.Column(instance.EntityType.BaseType.Name + "Id"); 
    } 

    public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria) 
    { 
     criteria.Expect(x => x.EntityType == typeof(TaskDownload)); 
    } 
} 

次に、あなたが構成にあなたのconvetionを追加します。

Fluently.Configure() 
    //... 
    .Mappings(m => 
     { 
      m.FluentMappings 
      //... 
      .Conventions.Add<JoinedSubclassIdConvention>(); 
     }); 
+0

あなたの解決策を試してみると、それは魅力的に機能しました。助けてくれてありがとう。 –

+0

本当に古い質問ですが、まだ関連しています。これは、マップごとの方法ではなく、規約としてのみ設定できるのはなぜですか? – shortstuffsushi

関連する問題