0

私は Fluent Nhibernate と .NET の初心者です。私の質問が明確でない場合はお知らせください。

以下のようにアプリに3つのテーブルがあります

表 A

AID(PK)、CreatedDate(PK)、ZID、AFirstname、ALastname、AAddress、AZipCode

表 B

CID(PK)、AID(PK)、日付(PK)、フィールド1、フィールド2

表 C

CID (PK)、Cname

間違っている場合は修正してください。私のモデルクラスは以下のようになります。

public class A {
    public A() {}
    public virtual long AID { get; set; }
    public virtual int ZID { get; set; }
    public virtual DateTime CreatedDate { get; set; }
    public virtual string AFirstName { get; set; }
    public virtual string ALastName { get; set; }
    public virtual string AZip { get; set; }
    public virtual string AAddress { get; set; }
}

クラス A の MapperClass

public class AMap : ClassMap<A> {
    public AMap() {
        Table("A");
        CompositeId().KeyProperty(x => x.AID, "AID").KeyProperty(x => x.CreatedDate, "CreatedDate");
        Map(x => x.ZID).Column("ZID").Not.Nullable();
        Map(x => x.AFirstName).Column("AFirstname").Not.Nullable();
        Map(x => x.ALastName).Column("ALastname").Not.Nullable();
        //Same as above for Address and ZipCode
      }
}

私のBモデルクラスは以下のようになります

public class B{
public B() { }
public virtual long AID { get; set; }
public virtual int CID { get; set; }
public virtual DateTime Date { get; set; }
public virtual string Field1 {get; set; }
public virtual string Field2 {get; set; }
}

クラス B の Mapper クラス

public class BMap : ClassMap<B> {
    public BMap() {
        Table("B");
        CompositeId().KeyProperty(x => x.AID, "AID").KeyProperty(x => x.CID, "CID").KeyProperty(x => x.Date, "Date");
        Map(x => x.Field1).Column("Field1").Not.Nullable();
        //Same for Field2
    }
}

私のテーブル C モデル クラスは以下のようになります。

public class C{
        public C() { }
        public virtual int C{ get; set; }
        public virtual string Cname{ get; set; }
}

クラス C の MapperClass

public class C: ClassMap<C> {
    public C() {
        Table("C");
        Id(x => x.CID).GeneratedBy.Identity().Column("CID");
        Map(x => x.CName).Column("Cname").Length(64);
    }
}

多くの人が、テーブルのデザインが適切ではないと主張するかもしれません。しかし、この時点では何もできず、間違いなくこの種の設計はパフォーマンスを低下させる可能性がありますが、しばらくの間、これと一緒に暮らす必要があると思います.

ここで、3 つのテーブルすべてのマッピングを作成する際に助けが必要です。また、Criteria API を使用して、3 つのテーブルすべてを結合するためのクエリを作成することもできます。

私のアプリケーションでは、別の関数から ZID を取得します。ZID に応じて、AFirstName、ALastName、Field1、Field2、CName を取得する必要があります。これはどのように可能ですか?

助けてください。また、問題が明確でない場合はお知らせください。

前もって感謝します。

4

1 に答える 1

0

IDを元のプロパティへの参照に置き換えて、それらをナビゲートできるようにします

public class B
{
    public virtual A A { get; set; }
    public virtual C C { get; set; }
    public virtual string Field1 {get; set; }
    public virtual string Field2 {get; set; }
}

public class BMap : ClassMap<B>
{
    public BMap()
    {
        Table("B");
        CompositeId()
            .KeyReference(x => x.A, "AID", "Date")
            .KeyReference(x => x.C, "CID");

        Map(x => x.Field1, "Field1").Not.Nullable();
        Map(x => x.Field2, "Field2").Not.Nullable();
    }
}

// query for it

var results = session.CreateCritera<B>()
    .JoinAlias("A", "a")
    .JoinAlias("C", "c")
    .SetProjection(Projections.List()
        .Add(Projections.Property("Field1"), "Field1")
        .Add(Projections.Property("Field2"), "Field2")
        .Add(Projections.Property("a.CreatedDate"), "Date")
        .Add(Projections.Property("c.Name"), "CName"))
    .SetResulttransformer(Transformers.AliasToBean<YourDto>())
    .List<YourDto>();
于 2012-08-23T14:33:32.893 に答える