Обратный атрибут в NHibernate

Для извлечения данных из таблицы данных используйте метод расширения .Field() из System.Data.DataSetExtensions. Пожалуйста, смотрите документацию DataRow.Field .

Вам необходимо создать список типа PurchaseInvoice и выполнить итерацию по коллекции DataRow table.Rows.

См. Пример ниже:

// create a list for your invoices
List invoices = new List();

foreach (DataRow row in dtPurchaseInvoice.Rows)
{   //                                   ^ Rows
    // create invoice
    PurchaseInvoice invoice = new PurchaseInvoice();

    // get an int
    invoice.PurchaseInvoiceNo = row.Field("PurchaseInvoiceNo"); 

    // get a string
    invoice.CustomerName = row.Field("CustomerName");

    // get a DateTime
    invoice.PurchaseDate = row.Field("PurchaseDate");

    // get a double
    invoice.PurchaseValue = row.Field("PurchaseValue");

    // add invoice to list     
    invoices.Add(invoice);
}

Использование расширения .Field() означает, что вам не нужно преобразовывать / приводить объект в правильный тип - он обрабатывается расширением для вас.

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

DateTime? date = row.Field("PurchaseDate");

87
задан Rap 21 December 2010 в 18:20
поделиться

2 ответа

Обратный атрибут не должен иметь значение true...

Вы используете обратный атрибут для определения 'владельца' ассоциации. (Ассоциация может иметь только одного владельца, таким образом, один конец должен быть установлен на инверсию, другой должен быть установлен на 'не обратный'). (Владелец: inverse=false; Невладелец: inverse=true)

В one-many ассоциации, если Вы не отмечаете набор как обратный конец, затем NHibernate выполнит дополнительное ОБНОВЛЕНИЕ. На самом деле, в этом случае, NHibernate сначала вставит объект, который содержится в наборе, при необходимости вставьте объект, который владеет набором, и впоследствии, обновляет 'объект набора', так, чтобы внешний ключ был установлен, и ассоциация сделана. (Обратите внимание, что это также означает, что внешний ключ в Вашем DB должен быть nullable).

Когда Вы отметите конец набора как 'инверсию', затем NHibernate сначала сохранит объект, который 'владеет' набором и сохранит объекты, которые находятся в наборе впоследствии, избегая дополнительного оператора UPDATE.

Так, в двунаправленной ассоциации у Вас всегда есть один обратный конец.

121
ответ дан codekaizen 24 November 2019 в 07:50
поделиться

В дополнение к ответу выше , и, как я понимаю, вам необходимо вручную сохранить значение внешнего ключа в коллекции, то есть если вы не хотите дополнительный оператор обновления:

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

для дальнейшего объяснения обратного атрибута, проверьте следующий пост:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/

10
ответ дан 24 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: