gpt4 book ai didi

c# - 为什么我的 Fluent NHibernate 子类映射会生成冗余列?

转载 作者:行者123 更新时间:2023-11-30 18:06:45 25 4
gpt4 key购买 nike

我有以下实体

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

当我生成我的架构时,表创建如下

Card
---------
Id
Name
Description
Product_id
Sprint_id

Story
------------
Card_id
Points
Priority
Product_id
Sprint_id

我所期望的是仅在 Card 表中看到 Product_id 和 Sprint_id 列,而在 Story 表中看不到。

我做错了什么或误解了什么?

最佳答案

注意:仅在 NH2 项目上测试

好吧,一旦你读到这篇文章,你可能会想要咬一口门,但 TLDR 的原因是因为 Product_idSpring_id Story 中的列表格不是多余的 - 它们存在于 HasMany(x => x.Stories) SpringMap 和 ProductMap 中的关系。它们恰好与 CardMap 共享相同的命名约定。 References(x => x.ProductReferences(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列变为 SprintOwner_id .我不知道为什么会发生这种情况 - 我推测这是对流利/休眠部分的某种双向关系推理出错了,但我不会在这上面投入很少的钱。

关于c# - 为什么我的 Fluent NHibernate 子类映射会生成冗余列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4531901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com