1

Я довольно новичок в 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.

Кто-нибудь знает, почему это происходит?

ответ

3

Вы должны сопоставить ссылки проекта с Column и не ForeignKey

mapping.References<Project>(x => x.Project) 
      .Column("ProjectId"); 
+0

Да, это действительно помогло! Большое спасибо! – dasnervtdoch 2010-11-23 10:41:25