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'라는 개체가 있습니다.
아무도 알지 못합니다. 왜 이런 일이 발생합니까?
그래으로 프로젝트 참조를 매핑해야합니다! 고마워요! – dasnervtdoch