NHibenate: есть ли способ создать двунаправленные отношения «один ко многим» с помощью составных ключей? - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь настроить двунаправленное отношение «один-ко-многим» в NHibernate для 2 классов с комбинированными ключами, которые перекрываются.Другая трудность заключается в том, что я не могу просто отредактировать таблицы SQL, чтобы, например, добавить правильный идентификатор.

Это, вероятно, простой вопрос, но я нигде не могу найти ответ.

IНасколько я понимаю, у меня есть HasMany.Но я застрял с HasOne.Также пробовал со ссылкой.

public class Parent
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public List<Child> Children { get; set; }
    public string Data { get; set; }
}
public class Child
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
    public Parent Parent { get; set; }
    public string Data { get; set; }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C);
        Map(x => x.Data);
        HasMany(x => x.Children)
                .KeyColumn("A")
                .KeyColumn("B")
                .KeyColumn("C");
    }
}
public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        CompositeId()
            .KeyProperty(x => x.A)
            .KeyProperty(x => x.B)
            .KeyProperty(x => x.C)
            .KeyProperty(x => x.D);
        Map(x => x.Data);
        HasOne(x => x.Parent);
        // also tried
        //References<Parent>(x => x.Parent)
                //.Columns("A", "B", "C");
    }
}

Ошибка, которую я получаю сейчас: NHibernate.FKUnmatchingColumnsException: 'Внешний ключ (FK_3346D8AD: Child [C])) должен иметь такое же количество столбцов, что и первичный ключ, на который есть ссылка (Parent).[A, B, C]) '

1 Ответ

1 голос
/ 15 июля 2019

Извините, я не знаю бегло nhibernate, но в целом относительно вашего Child.Parent сопоставления свойств - взаимно-однозначное (HasOne) здесь не правильное сопоставление.Отображение один-к-одному будет работать только тогда, когда Id одинаково для обеих сущностей.Таким образом, должно быть [A, B, C] для Child и Parent.

Но отображение много-к-одному (References) должно работать - вам просто нужно отметить все столбцы, на которые есть ссылкиили свойство как доступное только для чтения (вам нужно найти беглый эквивалент insert="false" update="false" в hbm.xml), поскольку эти столбцы уже являются частью вашего сопоставления идентификаторов.В hbm.xml отображение будет выглядеть так:

<many-to-one name="Parent" insert="false" update="false" not-null="true">
    <column name="A"/>
    <column name="B"/>
    <column name="C"/>
</many-to-one>

Так что в беглом nhibernate оно должно выглядеть примерно так:

References<Parent>(x => x.Parent).Columns("A", "B", "C")
//Not sure if it exists
.Readonly(); 
//Or something like this
.Insert(false).Update(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...