簡體   English   中英

流利的Nhibernate映射通過兩個非主鍵列聯接

[英]Fluent Nhibernate mapping to join by two non primary key columns

我想知道是否有一種方法可以在不創建視圖的情況下將具有兩個非主鍵列的兩個表聯接在一起? 我有一個名為“ Make”的表,其中包含“ Name”和“ Year”列,我想與另一個名為“ Style”的表,其中包含“ MakeName”和“ MakeYear”列。 一個“制作”可以有多個“樣式”。 這是我到目前為止創建的實體:

public class Make
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Year { get; set; }
    public virtual IList<Style> Styles { get; set; } 
}

public class Style
{
    public virtual int Id { get; set; }
    public virtual string MakeName { get; set; }
    public virtual string MakeYear { get; set; }
    public virtual string Class { get; set; }
    public virtual Make Make { get; set; }
}

這些也是我到目前為止的類映射:

public class MakeMap : ClassMap<Make>
{
    public MakeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Year);
        // Bad mapping...
        //HasManyToMany(x => x.Styles).Table("Make").AsBag()
          .ParentKeyColumn("MakeName")
          .ChildKeyColumn("MakeYear").Cascade.All();
        Table("Make");
    }
}

public class StyleMap : ClassMap<Style>
{
    public StyleMap()
    {
        Id(x => x.Id);
        Map(x => x.Class);
        Map(x => x.MakeName);
        Map(x => x.MakeYear);
        // Ends up overwriting the "MakeName" column
        References(x => x.Make).Column("MakeName").PropertyRef("Name").
              Column("MakeYear").PropertyRef("Year");
        Table("Style");
    }
}

謝謝!

我更喜歡第一個的3個選擇

  1. 選項:

    更改db schema ,包括廠名id ,而不是名稱,一年分為裝飾表

  2. 選項

References(x => x.Make)
    .Formula("(Select s.Id FROM Style s WHERE s.Name = MakeName AND s.Year = MakeYear)");
  1. 選項
public class Make
{
    public virtual int Id { get; set; }

    public virtual MakeId BusinessId { get; private set; }
}

public class MakeId
{
    public virtual string Name { get; set; }
    public virtual string Year { get; set; }
}

public class MakeMap : ClassMap<Make>
{
    public MakeMap()
    {
        Id(x => x.Id);
        Component("BusinessId", c => 
            c.Map(x => x.Name);
            c.Map(x => x.Year);
        });

        HasMany(x => x.Styles)
          .PropertyRef("BusinessId")
          .KeyColumns.Add("MakeName", "MakeYear")
          .Cascade.All();
        Table("Make");
    }
}

public class StyleMap : ClassMap<Style>
{
    public StyleMap()
    {
        Table("Style");

        Id(x => x.Id);
        Map(x => x.Class);

        References(x => x.Make)
            .PropertyRef("BusinessId")
            .Columns.Add("MakeName", "MakeYear");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM