簡體   English   中英

流利的Nhibernate將多個類映射到單個外鍵

[英]Fluent Nhibernate mapping multiple classes to single foreign key

我有一個數據庫結構,其中一個表擴展了另一個表,然后第三個表具有在前兩個表中有效的外鍵。

例如:

TABLE Person
PersonId int
Name varchar
ShirtId int

TABLE Shirt
ShirtId int
Color string

TABLE SpecialShirt
ShirtId int
Sleeves int

這些類如下所示:

public class Person
{
    public virtual int PersonId { get; set; }
    public virtual string Name { get; set; }
    public virtual Shirt Shirt { get; set; }
    public virtual SpecialShirt SpecialShirt { get; set; }
}

public class Shirt
{
    public Shirt()
    {
        PersonList = new List<Person>();
    }

    public virtual int ShirtId { get; set; }
    public virtual string Color { get; set; }
    public virtual IList<Person> PersonList { get; set; }
    public virtual void AddPerson(Person p)
    {
        PersonList.Add(p);
    }
}

public class SpecialShirt : Shirt
{
    public virtual int Sleeves { get; set; }
}

映射如下所示:

public class TestPersonMap : ClassMap<TestPerson>
{
    public TestPersonMap()
    {
        Table("TestPerson");
        Id(x => x.PersonId).GeneratedBy.Native();
        Map(x => x.Name);
        References(x => x.Shirt).Column("ShirtId");
        References(x => x.SpecialShirt).Column("ShirtId"); // commenting out this line works
    }
}

public class TestShirtMap : ClassMap<TestShirt>
{
    public TestShirtMap()
    {
        Table("TestShirt");
        Id(x => x.ShirtId).GeneratedBy.Native();
        Map(x => x.Color);
        HasMany(x => x.PersonList).KeyColumn("ShirtId").Inverse().Cascade.All();
    }
}

public class TestSpecialShirtMap : SubclassMap<TestSpecialShirt>
{
    public TestSpecialShirtMap()
    {
        Table("TestSpecialShirt");
        KeyColumn("ShirtId");
        Map(x => x.Sleeves).Column("Sleeves");
    }
}

然后,我嘗試保存新的Person和Shirt實例,如下所示:

var shirt1 = new TestShirt() {Color = "Red"};
var person1 = new TestPerson() {Name = "Fred Person", Shirt = shirt1};
shirt1.AddPerson(person1);

session.Save(shirt1);
session.Save(person1);

此代碼出現以下錯誤:

System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

如果我從Person刪除對SpecialShirt的引用,它將起作用。 我如何在同一列(“ ShirtId”)上有兩個引用? 或者,還有更好的方法? 我真的不能更改表結構。

關系如何運作? 通常,一個Person穿着ShirtShirt既可以是Shirt也可以是SpecialShirt 因為SpecialShirtShirt ,所以“人”只需要引用Shirt NHibernate知道所有關於每個具體類表的映射(這就是您所擁有的)。

我找到了解決方案。 很難看,但是可以用。 我將命令DynamicInsert()添加到PersonMap中。 現在的地圖是:

public class TestPersonMap : ClassMap<TestPerson>
{
 public TestPersonMap()
 {
  Table("TestPerson");
  Id(x => x.PersonId).GeneratedBy.Native();
  Map(x => x.Name);
  References(x => x.Shirt).Column("ShirtId");
  References(x => x.SpecialShirt).Column("ShirtId"); 

  DynamicInsert();
 }
}

然后,我必須分別保存“襯衫”和“人”,所以級聯並沒有真正起作用。

到目前為止,這是可行的。 老實說,我不知道DynamicInsert的作用。 研究此方法時,我只能找到過時的文檔和無用的論壇主題。

我只能假設這在將來的某個時候會失敗。

暫無
暫無

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

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