2012-02-05 97 views
3

爲什麼沒有關於綁定NHibernate到在Winforms的任何教程。只有我想使用它? 我知道這是綁定到DataGridView集合的問題。但是我在製作CRUD時遇到了問題。Nhibernate綁定到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將更新該新行。應該插入。

+0

公共屬性應該以這種格式=> UpperCase。所以FirstName不是first_name。 **標準**您知道... – gdoron 2012-02-05 12:12:24

+0

感謝您的建議 – userbb 2012-02-05 12:23:29

+0

答案如何? – gdoron 2012-02-05 12:27:43

回答

0

行被其它事務更新或刪除(或者未保存值的映射是不正確的)

Employee可能有一個ID,從而NHibernate的「認爲」應該更新,但NHibernate的未找到所以NH交易認爲員工在其他交易中被刪除。

id屬性有一個值,而不是默認值。確保new_employee.id = 0;

+0

好的。我知道發生了什麼事。我沒有看到session.Save(new_employee)引發的異常。說我的屬性是空的。所以我在保存之前放入了空字符串。我不知道最佳做法是什麼,但我認爲非空檢查應推遲提交。 – userbb 2012-02-05 12:29:08

+0

現在它工作。提交後我看到新記錄。我只想知道爲什麼NH發送INSERT並且在它更新了相同的記錄之後。 – userbb 2012-02-05 12:30:22

+0

@userbb。該更新是另一個問題。閱讀[這](http://stackoverflow.com/questions/4883900/what-does-inverse-and-cascade-means-in-nhibernate)張貼在這裏。希望它有幫助。 – gdoron 2012-02-05 13:07:14