代码之家  ›  专栏  ›  技术社区  ›  abedurftig

使用Fluent NHibernate自动映射创建多个双向一对多关联

  •  1
  • abedurftig  · 技术社区  · 14 年前

    我对NHibernate和.NET框架还比较陌生。

    我想映射我的项目类,它有一对多关系子项目和项目任务类。

    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中的子项目类的所有实例都将正确存储到数据库中。当我对ProjectTask类使用第二个重写时,出现以下异常:

    --->NHibernate.hibernate异常:数据库中已存在名为“ProjectId”的对象。无法创建约束。请参阅以前的错误。

    --->System.Data.SqlClient.SqlException:数据库中已存在名为“ProjectId”的对象。

    有人知道为什么会这样吗?

    1 回复  |  直到 13 年前
        1
  •  3
  •   Variant    14 年前

    您应该将项目引用映射为 Column 而不是 ForeignKey

    mapping.References<Project>(x => x.Project)
                .Column("ProjectId");
    
    推荐文章