簡體   English   中英

使用Fluent NHibernate自動映射創建多個雙向一對多關聯

[英]Creating multiple bi-directial one-to-many associations with Fluent NHibernate automapping

我對NHibernate和.NET框架還很陌生。

我想映射我的Project類,該類具有一對多關系Subproject和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");
    }
}

當我僅將關聯與Subproject類映射時,一切正常,並且Project.Subprojects中Subproject類的所有實例都將正確存儲到數據庫中。 當我對ProjectTask類使用第二個替代時,出現以下異常:

---> NHibernate.HibernateException:數據庫中已經有一個名為“ ProjectId”的對象。 無法創建約束。 請參閱先前的錯誤。

---> System.Data.SqlClient.SqlException:數據庫中已經有一個名為“ ProjectId”的對象。

有人知道,為什么會這樣嗎?

您應該使用Column而不是ForeignKey映射項目引用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM