Свободное отображение NHibernate на нескольких не-ПК полях

У меня ситуация, аналогичная описанной вСвободное отображение NHibernate не на ПК поле

Однако связь между моими таблицами описывается несколькими столбцами, не относящимися к первичному ключу. Представь себе Криса МикаСитуация, но гдеPerson имеетJobType иCode что вместедолжен (извини, этобаза данных) уникально опишитеPerson

Person
------
Id PK
JobType
Code
Name

Order
-----
Id PK
Person_JobType
Person_Code
OrderDetails

Серхат Özgel-хответ описывает использованиеPropertyRef, Но я могу'не найти способ сделать это индивидуально для нескольких столбцов. Я'мы пробовали похожие на

class PersonMap : ClassMap
{
    public PersonMap()
    {
        HasMany(p => p.Order)
            .KeyColumns.Add("Person_JobType")
            .PropertyRef("JobType")
            .KeyColumns.Add("Person_Code")
            .PropertyRef("Code")
    }
}

Но это, очевидно, нет работы, так какKeyColumns.Add() возвращает другойOneToManyPart PropertyRef() ISN»запускается против отдельного добавляемого столбца. ВторойPropertyRef() просто перезаписывает первый, и я получаю следующую ошибку:

NHibernate.MappingException : collection foreign key mapping
has wrong number of columns: MyApp.Person.Order type: Int32

мы смотрели на различные перегрузки KeyColumns.Add (),

public TParent Add(string name)
public TParent Add(params string[] names)
public TParent Add(string columnName, Action customColumnMapping)
public TParent Add(ColumnMapping column)

Конкретно последние два, но не моглине могу найти способ установитьPropertyRef индивидуальный уровень для каждого столбца :( Есть ли способ сделать это? Я иду по этому пути совсем неправильно?

Ответы на вопрос(1)

Решение Вопроса

class PersonMap : ClassMap<person>
{
    public PersonMap()
    {
        Map(_ => JobTypeAndCode)
            .Columns.Add("Person_JobType", "Person_Code")
            .ReadOnly()
            .LazyLoad() // optional: prevent loading the Columns twice
            .Access.None();

        HasMany(p => p.Orders)
            .KeyColumns.Add("Person_JobType", "Person_Code")
            .PropertyRef("JobTypeAndCode")
    }

    private object JobTypeAndCode { get; set; } // FakeProperty
}
</person>

Примечание: я никогда не заставлял это работать, используя NHibernate MappingByCode

 dreamerkumar12 нояб. 2014 г., 16:43
Это ошибка, с которой я столкнулся при попытке такого подхода (не смог обойти ее): любые сопоставления могут не являться частью свойства-ссылки
 Firo15 нояб. 2014 г., 04:36
@VishalKumar лучше задать вопрос и выложить какой-нибудь код? Похоже, что свойство для propertyref является ссылкой, а не Map
 mo.06 июн. 2013 г., 19:03
Вау круто. Для этого я не использовал отображение NHibernate между этими классами, а просто извлекал значения и возвращал их в другой класс ».Хранилище для получения соответствующих записей, когда это необходимо - довольно некрасиво. Хотел бы я знать твой трюк на прошлой неделе :)
 Leo Y01 янв. 2017 г., 18:04
Ответ @firo работает с одним существенным недостатком. Исходный тип столбцов поврежден в родительской таблице. У кого-нибудь есть идеи, как это можно исправить?
 Leo Y06 янв. 2017 г., 15:09
@firo Это означает, что когда я сопоставляю свои свойства типа int и затем использую для них эту технику, схема БД создается с этими типами полей как varbinary (max). Я попытаюсь создать схему, используя SQL DDL, и использовать сопоставление только для запросов, и сообщу, работает ли она.
 Firo03 янв. 2017 г., 21:29
@ LeoY что значит испорченный? Я думаю, что я проверил это, и это сработало.

Ваш ответ на вопрос