1

NHibernate와 .NET 프레임 워크에 대해 상당히 새로운 것입니다.Fluent NHibernate 자동 매핑을 사용하여 복수의 양방향 one-to-many 연관 만들기

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 클래스의 두 번째 재정의를 사용할 때 다음 예외가 발생합니다.

---> NHibernate.HibernateException : 이미 데이터베이스에 'ProjectId'라는 개체가 있습니다. 제약 조건을 만들 수 없습니다. 이전 오류를 참조하십시오.

---> System.Data.SqlClient.SqlException : 이미 데이터베이스에 'ProjectId'라는 개체가 있습니다.

아무도 알지 못합니다. 왜 이런 일이 발생합니까?

답변

3

당신은 정말 도움이하는 Column 아닌 ForeignKey

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

그래으로 프로젝트 참조를 매핑해야합니다! 고마워요! – dasnervtdoch