我有以下实体
public abstract class Card
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual Product Product { get; set; }
public virtual Sprint Sprint { get; set; }
}
public class Story:Card
{
public virtual double Points { get; set; }
public virtual int Priority { get; set; }
}
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Story> Stories { get; private set; }
public Product()
{
Stories = new List<Story>();
}
}
以下映射
public class CardMap:ClassMap<Card>
{
public CardMap()
{
Id(c => c.Id)
.Index("Card_Id");
Map(c => c.Name)
.Length(50)
.Not.Nullable();
Map(c => c.Description)
.Length(1024)
.Not.Nullable();
References(c=>c.Product)
.Not.Nullable();
References(c=>c.Sprint)
.Nullable();
}
}
public class StoryMap : SubclassMap<Story>
{
public StoryMap()
{
Map(s => s.Points);
Map(s => s.Priority);
}
}
public class ProductMap:ClassMap<Product>
{
public ProductMap()
{
Id(p => p.Id)
.Index("Product_Id");
Map(p => p.Name)
.Length(50)
.Not.Nullable();
HasMany(p => p.Stories)
.Inverse();
}
当我生成Schema时,表格按如下方式创建
Card
---------
Id
Name
Description
Product_id
Sprint_id
Story
------------
Card_id
Points
Priority
Product_id
Sprint_id
我原本期望看到Card表中的Product_id和Sprint_id列,而不是Story表。
我做错了什么或误解了什么?
答案 0 :(得分:1)
注意:仅在NH2项目上进行测试
嗯,一旦你读到这个,你可能会想要在门上咀嚼,但TLDR的原因是因为Product_id
表中的Spring_id
和Story
列是< strong> not 冗余 - 它们存在于SpringMap和ProductMap中的HasMany(x => x.Stories)
关系中。它们恰好与CardMap
References(x => x.Product
和References(x => x.Sprint)
共享相同的命名约定。
通过评论ProductMap.cs:24-25
和SprintMap.cs:22
并重建来验证这一点。
如果以上内容没有意义,请告诉我,我会尝试进一步详细说明。
所以,应该正常工作。如果您想澄清列,您可以明确定义列名称,如下所示:
ProductMap.cs
HasMany(p => p.Stories)
.KeyColumn("ProductOwner_id")
.Inverse();
SprintMap.cs
HasMany(s => s.Stories)
.KeyColumn("SprintOwner_id")
;
CardMap.cs
References(c=>c.Product)
.Column("Product_id")
.Not.Nullable();
References(c=>c.Sprint)
.Column("Sprint_id")
.Nullable();
这里我猜测故事和产品/ Sprint之间的1:N关系是“所有者”。您可能希望将其重命名为适合语义的任何内容。
另一件事。 我会认为最后的更改(对CardMap.cs
的更改)是不必要的 - 但它们似乎是出于某种原因,或者Sprint_id
列变为{{1} }。我不知道为什么会发生这种情况 - 我会推测这是某种双向关系推理,对于流利/ nhibernates部分出错了,但我只花了很少钱。
答案 1 :(得分:0)
我看到Story
实体继承自您创建的Card
实体,但您不知道为什么在Story表架构中有Product_Id和Sprint_Id属性,因为它们是虚拟属性在卡类中。
我猜这是因为在NHibernate中,所有属性都需要是虚拟的,但最初只需要。他们并没有真正保持虚拟。 NHibernate框架会覆盖它们,可能正因为如此,这种情况发生在你身上。