Ссылка на проблемное сопоставление для составного ключа с помощью Fluent NHibernate - PullRequest
0 голосов
/ 30 марта 2020
  • У меня есть класс с именем ... "ClassA", в котором первичный ключ имеет int ID.
  • У меня есть класс с именем "ClassB", у которого есть составной первичный ключ, образованный Id ClassAId, который является ссылкой на ClassA, и другой int с именем Version.
  • И у меня есть класс с именем C, который имеет int ID в качестве первичного ключа, и внешний ключ к ClassB, состоящий из ClassBId, ClassAId и Version.

Я не могу найти способ сопоставить это с Fluent NHibernate.

Мои определения классов такие: я опущу Equals и GetHa sh part -:

public class ClassA
{
    public virtual int Id { get; set; }
}
public class ClassB
{
    public virtual int Id { get; set; }
    public virtual ClassA ClassA { get; set; }
    public virtual ICollection<ClassC> ClassCCollection { get; set; }
}
public class ClassC
{
    public virtual int Id { get; set; }
    public virtual ClassB ClassB { get; set; }
}

И мои конструкторы отображения:

public ClassAMap()
{
    Table("ClassA");
    Id(c => c.Id);
}
public ClassBMap()
{
    Table("ClassB");
    CompositeId()
        .KeyProperty(c => c.Id)
        .KeyReference(c => c.ClassA, "ClassAId")
        .KeyProperty(c => c.Version);
    HasMany(c => c.Edges)
        .Inverse()
        .Cascade.All().AsList().KeyColumns.Add("ClassBId", "ClassAId", "Version");
}
public ClassCMap()
{
    Table("ClassC");
    Id(c => c.Id);
    References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();
}

Но когда я пытаюсь запустить приложение, SchemaUpdate сообщает, что

FKUnmatchingColumnsException: Внешний ключ (FK_6C7456E0: Class C [ClassBId, ClassAId, Version])) должен иметь то же количество столбцов, что и первичный ключ, на который есть ссылка (ClassB [Id, ClassAId, Version])

Может быть, я не очень хорош в математике, но кажется, что 3 столбца количество столбцов равно 3. Я что-то упустил? Спасибо.

1 Ответ

0 голосов
/ 31 марта 2020

Очень глупая ошибка:

Я писал

References(n => n.ClassB).Columns("ClassBId, ClassAId, Version").Not.Nullable();

Поместив три столбца в одну строку. Когда это должно быть:

References(n => n.ClassB).Columns("ClassBId", "ClassAId", "Version").Not.Nullable();

Лапсус, который застрял на два дня.

...