余分な列を持つ多対多テーブルでこの問題を認識しようとしている同じ場所で、私は周りを回っています。私はあなたがここで助けることができるなら、私のプライドを飲み込んで、経験豊富な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
感謝を。私はこれをチェックし、問題が解決したかどうかを確認します。私はcompositeIdを使用しようとしていましたが、私はNonUniqueObjectException -sをたくさん取得しています。 –