2011-11-09 30 views
0

余分な列を持つ多対多テーブルでこの問題を認識しようとしている同じ場所で、私は周りを回っています。私はあなたがここで助けることができるなら、私のプライドを飲み込んで、経験豊富なNHibernateのエキスパートに尋ねています。Fluent NHibernateマッピング多対多フィールドと追加フィールド

多対多テーブルのコンポーネントを使用しようとしていますが、コンポーネントを特定の列に結合する場所を指定する場所が見つからないようです。私は完成情報オブジェクトを作成している限り、コンポーネントの存在と使用法は私の要件ではないと思います。

これは私の単純化されたスキーマです。

User 
................... 
Id 
Name 

Task 
................... 
Id 
Name 


Job 
................... 
Id 
Name 

JobTask 
................... 
JobId 
TaskId 
CompletedByUserId 
CompletionDate 
CompletionNotes 

それから私はそうのようなオブジェクトを持っている:

public class Job 
{ 
    long Id { get; set; } 
    IList<Task> Tasks { get; set; } 
} 


public class Task 
{ 
    long Id { get; set; } 
    string Name { get; set; } 
    CompletionInfo CompletionInfo { get; set; } 
} 

public class CompletionInfo 
{ 
    User User { get; set; } 
    DateTime CompletionDate { get; set; } 
} 

あなたが流暢NHibernateの中でこれを実装する方法を、あなたのアイデアを助けることはできますか?

私はJobMapでこのマッピングを以前に実行していましたが、多対多の列(TaskId、JobId)に対してのみ動作します。私は多くの-に多くの私は関係を表し、タスクをカプセル化するオブジェクトを作成する考えで物事を簡単にするために、その関係に関連する追加情報(dateCompleted、userCompleted、など)

HasManyToMany<Task>(job => job.Tasks) 
      .Table(ManyToManyTable) 
      .ParentKeyColumn("JobId") 
      .ChildKeyColumn("TaskId") 
      .Not.LazyLoad() 
      .Cascade.Delete(); 

を必要としています。ように: と私は実際のタスクのプロパティを変更するには、ジョブのタスクでプロキシを追加します。しかし、それはどこにも行きません。

これは一般的なものである必要があります。この問題に関してはあまり驚いていません。 当然、私はHasManyToManyを拡張する方法を愛していましたが、どのように、したがってこの投稿を確実にしていないでしょうか。

public class JobTask : Entity<long, JobTask> 
{ 
    public virtual Job ParentJob { get; set; } 

    public virtual Task Task { set;set; } 

    public virtual TaskCompletionDetails CompletionInformation 
    { 
     get 
     { 
      if (this.Task == null) 
       return null; 

      return Task.CompletionInformation; 
     } 

     set 
     { 
      if (this.Task == null) 
       return; 

      this.Task.CompletionInformation = value; 
     } 
    } 


    public virtual string CompletionNotes 
    { 
     get 
     { 
      if (this.Task == null || this.Task.CompletionInformation == null) 
       return null; 

      return Task.CompletionInformation.Notes; 
     } 

     set 
     { 
      if (this.Task == null) 
       return; 

      this.Task.CompletionInformation.Notes = value; 
     } 
    } 

    public virtual DateTime? CompletionDate 
    { 
     get 
     { 
      if (this.Task == null || this.Task.CompletionInformation == null) 
       return null; 

      return Task.CompletionInformation.Date; 
     } 

     set 
     { 
      if (this.Task == null) 
       return; 

      this.Task.CompletionInformation.Date = value; 
     } 
    } 

    public virtual IUser User 
    { 
     get 
     { 
      if (this.Task == null || this.Task.CompletionInformation == null) 
       return null; 

      return Task.CompletionInformation.User; 
     } 

     set 
     { 
      if (this.Task == null || value == null) 
       return; 

      if (this.Task.CompletionInformation != null) 
       this.Task.CompletionInformation.User = value; 
     } 
     } 
    } 
} 

は、これは私がそれを開始している地図の方向のようになります。

参考:

http://wiki.fluentnhibernate.org/Fluent_mapping

public class JobTaskMap : ClassMap<JobTask> 
{ 
    private const string ModelTable = "[JobTasks]"; 

    public JobTaskMap() 
    { 
     Table(ModelTable); 

     Id(jobTask => jobTask.Id) 
      .Column("Id") 
      .GeneratedBy.Identity(); 

     References<Job>(jobTask => jobTask.ParentJob) 
      .Column("JobId") 
      .Fetch.Join(); 

     Component<Task>(jobTask => (Task) jobTask.Task, 
       // This is the task 
       comp => 
       { 
        // This is the task completion information 
        comp.Component<TaskCompletionDetails>(
         task => (TaskCompletionDetails)task.CompletionInformation, 
         compInfo => 
         {  
          compInfo.Map(info => info.Date) 
           .Column("CompletionDate") 
           .Nullable(); 

          compInfo.Map(info => info.Notes) 
           .Column("CompletionNotes") 
           .Nullable(); 

          compInfo.References<User>(info => info.User) 
           .Column("CompletedByUserId") 
           .Nullable() 
           .Fetch.Join(); 
         }); 
       }); 

    } 

これらは私が成功せずに続いているいくつかの他の関連する読書しています

Fluent Nhibernate Many-to-Many mapping with extra column

答えて

0

heres使用されるID生成方法に依存する方法。 Identityが使用されている場合、これは(少なくとも、NHは、様々な理由のためのアイデンティティの使用を推奨してい)しないだろうが、ID自体を挿入し、すべての戦略とそれが働くだろう:応答フィーロため

class JobMap : ClassMap<Job> 
{ 
    public JobMap() 
    { 
     Id(x => x.Id); 

     HasMany(x => x.Tasks) 
      .KeyColumn("JobId"); 
    } 
} 

class TaskMap : ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("JobTask"); 
     Id(x => x.Id, "TaskId"); 

     Component(x => x.CompletionInfo, c => 
     { 
      c.Map(x => x.CompletionDate); 
      c.References(x => x.User, "CompletedByUserId"); 
     }); 

     Join("Task", join => 
     { 
      join.Map(x => x.Name, "Name"); 
     }); 
    } 
} 
+0

感謝を。私はこれをチェックし、問題が解決したかどうかを確認します。私はcompositeIdを使用しようとしていましたが、私はNonUniqueObjectException -sをたくさん取得しています。 –

関連する問題