【问题标题】:Fluent NHibernate Composite Key QueryFluent NHibernate 复合键查询
【发布时间】:2012-08-22 03:59:36
【问题描述】:

我是 Fluent Nhibernate 和 .NET 的新手。因此,如果我的问题不清楚,请告诉我。

我在应用中有 3 个表格,如下所示

表 A

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

表 B

CID(PK)、AID(PK)、日期(PK)、Field1、Field2

表 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 类的映射器类

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);
    }
}

现在很多人可能会争辩说桌子设计不合适。但此时无能为力,这种设计肯定会降低性能,但我想我们必须忍受一段时间。

现在我需要一些帮助来编写所有三个表的映射。我也可以使用 Criteria API 编写一个查询来加入所有 3 个表。

在我的应用程序中,我从另一个函数中获取 ZID。现在根据 ZID,我需要获取 AFirstName、ALastName、Field1、Field2、CName。这怎么可能?

请帮忙。如果问题不清楚,也请告诉我。

提前致谢。

【问题讨论】:

  • 你的映射器类在哪里?
  • 如果你是初学者,我建议你选择最简单的解决方案,你可以用这个来解决。
  • 刚刚添加了 Mappers 类。请让我知道这是否正确。
  • 感谢 DarthVader 的快速回复。我正在尝试做的这个示例已经完成了一半,我现在不能从新的东西开始。是的,我知道一点 C# 和 Fluent NHibernate 的基础知识。我只是想要一些想法向前推进。

标签: c# .net fluent-nhibernate


【解决方案1】:

将 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>();

【讨论】:

  • 非常感谢 Firo,这真的很有帮助。抱歉延迟回复。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2010-12-09
相关资源
最近更新 更多