私はNHibernateと.NETフレームワークにかなり慣れていません。
1対多の関係のSubprojectクラスとProjectTaskクラスを持つProjectクラスをマップしたいと思います。
public class Project : ProjectItem
{
public virtual IList<Subproject> Subprojects { get; set; }
public virtual IList<ProjectTask> Tasks { get; set; }
[NotNull]
public virtual ProjectStatus Status { get; set; }
public Project()
{
Subprojects = new List<Subproject>();
Tasks = new List<ProjectTask>();
Status = new ProjectStatus();
}
public virtual void AddSubProject(Subproject subproject)
{
subproject.Project = this;
Subprojects.Add(subproject);
}
public virtual void RemoveSubProject(Subproject subproject)
{
Subprojects.Remove(subproject);
}
public virtual void AddTask(ProjectTask task)
{
task.Project = this;
Tasks.Add(task);
}
public virtual void RemoveTask(ProjectTask task)
{
Tasks.Remove(task);
}
}
public class ProjectTask : ProjectItemTask
{
[NotNull]
public virtual Project Project { get; set; }
}
public class Subproject : ProjectItem
{
[NotNull]
public virtual Project Project { get; set; }
}
私のエンティティは、抽象基本クラスからIdプロパティを継承します。
自動マッピングを使用してオーバーライドし、マッピングを再定義します。
public class ProjectMappingOverride : IAutoMappingOverride<Project>
{
public void Override(AutoMapping<Project> mapping)
{
mapping.HasMany<Subproject>(x => x.Subprojects)
.Cascade.All()
.Inverse()
.Not.LazyLoad()
.AsBag();
mapping.HasMany<ProjectTask>(x => x.Tasks)
.Cascade.All()
.Inverse()
.Not.LazyLoad()
.AsBag();
mapping.HasOne<ProjectStatus>(x => x.Status)
.Cascade.All()
.Not.LazyLoad();
}
}
public class SubprojectMappingOverride : IAutoMappingOverride<Subproject>
{
public void Override(AutoMapping<Subproject> mapping)
{
mapping.References<Project>(x => x.Project)
.ForeignKey("ProjectId");
}
}
public class ProjectTaskMappingOverride : IAutoMappingOverride<ProjectTask>
{
public void Override(AutoMapping<ProjectTask> mapping)
{
mapping.References<Project>(x => x.Project)
.ForeignKey("ProjectId");
}
}
サブプロジェクトクラスとの関連付けのみをマップすると、すべてが正常に機能し、Project.Subprojectsのサブプロジェクトクラスのすべてのインスタンスがデータベースに正しく保存されます。ProjectTaskクラスに2番目のオーバーライドを使用すると、次の例外が発生します。
---> NHibernate.HibernateException:データベースに「ProjectId」という名前のオブジェクトがすでに存在します。制約を作成できませんでした。以前のエラーを参照してください。
---> System.Data.SqlClient.SqlException:データベースに「ProjectId」という名前のオブジェクトがすでに存在します。
誰か知っていますか、なぜこれが起こるのですか?