[英]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
穿着Shirt
, Shirt
既可以是Shirt
也可以是SpecialShirt
。 因為SpecialShirt
是Shirt
,所以“人”只需要引用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.