Почему мои сопоставления подклассов Fluent NHibernate генерируют избыточные столбцы? - PullRequest
3 голосов
/ 26 декабря 2010

У меня есть следующие сущности

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

Я ожидал бы увидеть ТОЛЬКО столбцы Product_id и Sprint_id в таблице Card, а не в таблице Story.

Что я делаю неправильно или неправильно?

Ответы [ 2 ]

1 голос
/ 02 января 2011

Примечание: протестировано только на проекте NH2

Что ж, вы, вероятно, захотите пожевать дверь, как только прочитаете это, но причина TLDR в том, что * 1005Столбцы * и Spring_id в вашей таблице Story являются не избыточными - они существуют для отношений HasMany(x => x.Stories) в ваших SpringMap и ProductMap.Просто они имеют то же соглашение об именах, что и 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();

Здесь я предполагаю, что отношения 1: N между Story и Product /Спринт является "владельцем".Вы бы хотели переименовать его в семантическом порядке.

Еще одна вещь. Я мог бы подумать, что последние изменения (изменения в CardMap.cs) были бы ненужными - но они, по-видимому, по какой-то причине, или столбец Sprint_id становится SprintOwner_id.Я понятия не имею, почему это произойдет - я бы предположил, что это своего рода двунаправленное отношение, связанное с беглым / гибернатным компонентом, пошло наперекосяк, но я бы на это вложил очень мало денег.

0 голосов
/ 26 декабря 2010

Я вижу, что сущность Story наследует созданную вами сущность Card, но вы не знаете, почему у вас есть свойства Product_Id и Sprint_Id в схеме таблицы Story, поскольку они являются виртуальными свойствами в классе Card .

Я предполагаю, что это происходит потому, что в NHibernate все свойства должны быть виртуальными, но только сначала. Они на самом деле не остаются виртуальными. Среда NHibernate переопределяет их, и, вероятно, из-за этого, это происходит с вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...