2012-02-05 3 views
3

Почему нет никакого учебника о привязке NHibernate к DataGridView в Winforms. Только я хочу его использовать? Я знаю, что это вопрос привязки коллекции к DataGridView. Но у меня проблемы с созданием CRUD.Nhibernate bind to DataGridView

У меня есть базы данных SQLite + таблица с отображением:

<class name="Employee" table="emplyees" lazy="true"> 
    <id name="id"> 
     <generator class="increment"></generator> 
    </id> 

    <property name="first_name" not-null="true"></property> 
    <property name="last_name" not-null="true"></property> 
    <property name="login" not-null="true"></property> 
    <property name="sid"></property>   
</class> 

код, который работает.

Employee new_employee = 
    new Employee() { first_name = "test1", last_name = "test3", login = "login1" }; 
session.Save(new_employee); 
session.Commit(); 

Но если я связываю с DataGridView и использование сетки, чтобы вставить новую строку:

transaction = session.BeginTransaction(); 
employees = (from e in session.Linq<Employee>() select e).ToList<Employee>(); 
this.employeeBindingSource.DataSource = employees; 


private void employeeDataGridView_UserAddedRow(object sender, DataGridViewRowEventArgs e) 
{ 
Employee new_employee = (Employee)this.employeeBindingSource.Current; 
session.Save(new_employee); 
} 

После session.Commit() я получаю сообщение об ошибке: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect). В журналах я вижу, что NH посылает UPDATE для этой новой строки. Должен быть вставлен.

+0

Публичные свойства должны быть в этом формате => UpperCase. Итак, FirstName не first_name. ** стандарты ** вы знаете ... – gdoron

+0

спасибо за совет – userbb

+0

А как насчет ответа? – gdoron

ответ

0

Роу был обновлен или удален другой транзакция (или отображение неспасенного значения было неправильным)

Это Employee, вероятно, имеет идентификатор, таким образом, NHibernate «считает, что» она должна быть обновлена, но NHibernate не находит это, поэтому транзакция NH считает, что Employee был удален в некоторых других транзакциях.

Это свойство id имеет значение, а не значение по умолчанию. убедитесь, что new_employee.id = 0;

+0

Хорошо. Я знаю, что произошло. Я не видел исключений, созданных session.Save (new_employee); говоря, что мои свойства равны нулю. Поэтому перед сохранением я помещаю пустую строку. Я не знаю, что такое лучшая практика, но я думаю, что не-нулевая проверка должна быть отложена до фиксации. – userbb

+0

И теперь это работает. Я вижу новую запись после фиксации. Я только удивляюсь, почему NH отправляет INSERT и после него UPDATE из той же записи. – userbb

+0

@userbb. Это обновление является другой проблемой. прочитайте [this] (http://stackoverflow.com/questions/4883900/what-does-inverse-and-cascade-means-in-nhibernate) здесь. надеюсь, что это помогло. – gdoron