0

Site クラスと Phase クラスの 2 つのクラスがあります。Site クラスはフェーズのコレクションを定義します。各クラスはデータベース テーブルに対応します。データベース (SQL Server 2000) には、2 つのテーブル間に 1 対多の参照があるため、特定のサイトは多くのフェーズに関連付けることができますが、特定のフェーズは 1 つのサイトにしか関連付けることができません。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public class Site
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    public virtual ICollection<Phase> Phases {get; set;}
}

public class Phase
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    [Editable(true)]
    [StringLength(16)]
    public virtual string Code { get; set; }

    public virtual int SiteId {get; set;}
    public virtual Site Site {get; set;}
}

FluentNHibernate を使用してマッピングを行っています。これをマップして、新しい Site インスタンスを作成し、いくつかの Phase インスタンスを割り当て、1 回の呼び出しですべてのインスタンスをデータベースに取得できるようにします。

Site site = new Site() { Name = "SiteName" };
Phase phase = new Phase() { Name = "PhaseName", Code = "Code" };
Phase otherPhase = new Phase() { Name = "OtherPhaseName" };

site.Phases.Add(phase);
site.Phases.Add(otherPhase);

Session.SaveOrUpdate(site);

次のマッピングを配置していますが、うまくいきません。

public class SiteMap : ClassMap<Site>
{
    public SiteMap()
    {
        Id(p => p.Id).Column("ST_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("ST_Name");

        HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").LazyLoad().Inverse().AsSet();
    }
}

public class PhaseMap : ClassMap<Phase>
{
    public PhaseMap()
    {
        Id(p => p.Id).Column("PH_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("PH_Name");
        Map(p => p.Code).Column("PH_Code").Nullable();
        Map(p => p.SiteId).Column("ST_ID");

        References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
    }
}

私は一般的にNHibernateを初めて使用するので、ここに示されているマッピングには、私が気付いていない他の問題がある可能性があることを認識しています。これら 2 つのクラスを最適にマッピングする方法について、ご助力いただければ幸いです。ティア。

4

1 に答える 1

1
References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();

ただあるべき

References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy);

テーブルを挿入または更新するときに、Not Insert および Update の仕様はこの列を更新しません。

また、1対多の端でカスケードを指定する必要があります

HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").Cascade.AllDeleteOrphan().LazyLoad().Inverse().AsSet();
于 2011-03-08T17:54:12.043 に答える