Родительские и дочерние таблицы NHibernate имеют разное количество ключей в своих составных - PullRequest
0 голосов
/ 03 марта 2020

Я немного борюсь с отображением NHibernate в консольном приложении.

Вот резюме:

  • Это отношения один ко многим. PARENT_TABLE (один) - CHILD_TABLE (много)

  • PARENT_TABLE имеет составной ключ, состоящий из двух ключей: Vendor и Invoice

Id(x => x.Invoice).Column("INVOICE");

References(x => x.Distribution).Column("INVOICE");
  • CHILD_TABLE имеет составной ключ, состоящий из трех: Vendor, Invoice и Num
Id(x => x.Invoice).Column("INVOICE");

HasOne(x => x.Invoice).ForeignKey("INVOICE").Cascade.Refresh();

Когда я запускаю некоторые данные, которые имеют следующий пример:

Счет-фактура поставщика №

10 | 44 | 1

11 | 44 | 1

11 | 44 | 2

Я получаю сообщение об ошибке из-за дублирования идентификатора в счете-фактуре (имеет смысл)

Затем я попытался использовать составной идентификатор, используя 3 ключа для распределения и 2 ключа для счета-фактуры. Это, как я уверен, многие из вас уже знают, также привело к ошибке, поскольку есть две записи, которые используют 11 и 44 для Vendor и Invoice, соответственно.

Мой вопрос: есть ли способ объявить отношения с помощью составного идентификатора (INVOICE и VENDOR) и по-прежнему обеспечивать, чтобы дочерняя коллекция соблюдала / обеспечивала уникальность трехкомпонентной комбинации (INVOICE, VENDOR и NUM)?

Я пробовал несколько вариантов составные ключи и не смогли понять это. Может быть, это просто не для этого. Любая помощь будет высоко ценится!

1 Ответ

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

Если у вас есть составное определение идентификатора для ваших сущностей, вы должны отобразить его, используя метод CompositeId. В вашей дочерней сущности вы также должны определить ссылки на ключевые столбцы вашей родительской сущности, потому что это составной идентификатор (и именно поэтому мне лично не нравится работать с составными идентификаторами).

Учитывая вашу модель:

public class ParentEntity 
{
    public virtual int Vendor { get; set; }
    public virtual int Invoice { get; set; }

    // other properties
}

public class ChildEntity
{
    public virtual int Vendor { get; set; }
    public virtual int Invoice { get; set; }
    public virtual int Num { get; set; }

    public virtual ParentEntity ParentEntity { get; set; }
}

Ваши сопоставления могут быть такими:

public class ParentEntityMap : ClassMap<ParentEntity>
{
    public ParentEntityMap()
    {
        CompositeId()
            .KeyProperty(x => x.Vendor, "VENDOR")
            .KeyProperty(x => x.Invoice, "INVOICE");

        // other mappings ...
    }
}

public class ChildEntityMap : ClassMap<ChildEntity>
{
    public ChildEntity()
    {
        CompositeId()
            .KeyProperty(x => x.Vendor, "VENDOR")
            .KeyProperty(x => x.Invoice, "INVOICE")
            .KeyProperty(x => x.Num, "NUM");

        References(x => x.ParentEntity)
            .Columns("VENDOR", "INVOICE")
            .ReadOnly(); // if you are mapping the same columns of compositeId here, define it as readOnly to avoid inserting data two times on the same columns.
    }
}

Я не пробовал этот код, это просто предложение проверить, что может работать на вас.

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