Я довольно новичок в NHibernate и .NET framework.Создание нескольких двунаправленных ассоциаций «один-ко-многим» с автоматическим выпуском NHibernate
Я хочу отобразить мой класс Project, который имеет отношения «один ко многим» подпроекта и классы ProjectTask.
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, я получаю следующее исключение:
---> NHibernate.HibernateException: в базе уже есть объект с именем ProjectId. Не удалось создать ограничение. См. Предыдущие ошибки.
---> System.Data.SqlClient.SqlException: В базе данных уже есть объект с именем ProjectId.
Кто-нибудь знает, почему это происходит?
Да, это действительно помогло! Большое спасибо! – dasnervtdoch 2010-11-23 10:41:25