1

両側に複合キーがある 1 対多のマッピングで問題が発生しています。

これが私がこれまでに持っているものです:

public class OneSide
{
    public virtual int A { get; set; }//-A,B,C,D together form primary key
    public virtual int B { get; set; }
    public virtual int C { get; set; }
    public virtual int D { get; set; }
    public virtual int OtherData { get; set; }
    public virtual IList<ManySide> Ls { get; set; }
}

public class OneSideMap : ClassMap<OneSide>
{
    public OneSideMap()
    {
        LazyLoad();

        CompositeId().KeyProperty(x => x.A).KeyProperty(x => x.B).KeyProperty(x => x.C).KeyProperty(x => x.D);

        Map(x => x.OtherData).Not.Nullable();
        HasMany(x => x.Ls).KeyColumns.Add("A", "B", "C", "D").Inverse().Cascade.All();
    }
}

public class ManySide
{
    public virtual OneSide OneSide { get; set; }
    public virtual int A { get; set; }//-A,B,C,D,E together form primary key
    public virtual int B { get; set; }
    public virtual int C { get; set; }
    public virtual int D { get; set; }
    public virtual int E { get; set; }
    public virtual int OtherData2 { get; set; }
}

public class ManySideMap : ClassMap<ManySide>
{
    public ManySideMap()
    {
        LazyLoad();

        CompositeId().KeyReference(x => x.A).KeyReference(x => x.B).KeyReference(x => x.C).KeyReference(x => x.D).KeyProperty(x => x.E);

        Map(x => x.OtherData2).Not.Nullable();
        References(x => x.OneSide).Columns("A", "B", "C", "D").Cascade.All();
    }
}

データベース構造は次のとおりです。

table: OneSide:
int A;
int B;
int C;
int D;
int OtherData;

table: ManySide:
int A;
int B;
int C;
int D;
int E;
int OtherData2;

私はそれが正しくないことを知っており、数時間前のように NHibernate の学習を開始したため、何が問題なのかわかりません。誰かが私のコードで何が間違っているかを指摘できますか?

4

1 に答える 1

0

列を2回マップすることはできないため、oneSideへの参照はkeyreferenceである必要があります。

public class ManySideMap : ClassMap<ManySide>
{
    public ManySideMap()
    {
        LazyLoad();

        CompositeId()
            .KeyReference(x => x.OneSide, "A", "B", "C", "D")
            .KeyProperty(x => x.E);

        Map(x => x.OtherData2).Not.Nullable();
    }
}

ManySideから列Bにアクセスするのは簡単でmanysideObj.OneSide.B、主キーを形成する片側のプロパティにのみアクセスする限り、OneSideをロードする必要はありません。

于 2012-09-14T07:06:25.487 に答える