1

私はNHibernateと.NETフレームワークにかなり慣れていません。

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クラスに2番目のオーバーライドを使用すると、次の例外が発生します。

---> NHibernate.HibernateException:データベースに「ProjectId」という名前のオブジェクトがすでに存在します。制約を作成できませんでした。以前のエラーを参照してください。

---> System.Data.SqlClient.SqlException:データベースに「ProjectId」という名前のオブジェクトがすでに存在します。

誰か知っていますか、なぜこれが起こるのですか?

4

1 に答える 1

3

プロジェクト参照を、Columnではなく、でマップする必要がありますForeignKey

mapping.References<Project>(x => x.Project)
            .Column("ProjectId");
于 2010-11-23T08:31:24.990 に答える