[英]NHibernate insert new record with a null many-to-one mapping
我有一個映射到Company類的Companies表和一個映射到Website類的Websites表。 我的公司表基本上是固定不變的,但是我正嘗試使用以下內容插入新的網站記錄:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
CompanyId = 100
};
var repo = new WebsiteRepository();
repo.Add(website);
網站類具有CompanyId屬性,該屬性映射回COMPANY表中的ID列,但是由於Website類具有多對一映射,因此它試圖將website.Company.Id
屬性插入表中( (為null),而不是采用website.Id
屬性。
由於表位於2個單獨的數據庫中,因此不涉及外鍵。
這是我收到的錯誤:
NHibernate.Exceptions.GenericADOException:無法插入:[Models.Website] [SQL:插入到Database1.dbo.Websites(CompanyID,SiteRoot,活動)值(?,?,?); 選擇SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException:無法將值NULL插入表'Database1.dbo.Websites'的'CompanyID'列中; 列不允許為空。 INSERT失敗。
NHibernate:插入到Database1.dbo.Websites(CompanyID,SiteRoot,活動)值(@ p0,@ p1,@ p2); 選擇SCOPE_IDENTITY(); @ p0 = NULL [類型:Int32(0)],@ p1 ='example.com'[類型:字符串(4000)],@ p2 = True [類型:布爾(0)]
這里是映射:
<hibernate-mapping assembly="Models" namespace="Models" xmlns="urn:nhibernate-mapping-2.2" schema="Database1.dbo">
<class name="Website" table="Websites" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<many-to-one name="Company" column="CompanyID" fetch="join"/>
<property name="SiteRoot">
<column name="SiteRoot" sql-type="nvarchar" length="50" not-null="false" />
</property>
<property name="Active">
<column name="Active" sql-type="bit" not-null="true" />
</property>
</class>
</hibernate-mapping>
<hibernate-mapping assembly="Models" namespace="Models" xmlns="urn:nhibernate-mapping-2.2" schema="Database2.dbo">
<class name="Company" table="Companies" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<property name="CompanyId">
<column name="CompanyID" sql-type="int" not-null="true" />
</property>
<property name="CompanyName">
<column name="CompanyName" sql-type="nchar" not-null="false" />
</property>
<set name="Websites" table="Websites" schema="Database1.dbo" lazy="false">
<key column="CID"/>
<one-to-many class="Models.Website, Models" />
</set>
</class>
</hibernate-mapping>
您需要將公司分配給Company屬性,以實現多對一關系。 像這樣:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
Company = session.Load(100);
};
或者,如果您願意,請使用存儲庫:
var website = new Website
{
Active = true,
SiteRoot = "example.com",
Company = CompanyRepository.Get(100);
};
注意:
如果啟用了延遲加載,則session.Load
不會從數據庫加載任何內容。 它僅創建一個代理。 這非常有效。 最后,它僅使用100的外鍵為網站創建INSERT語句,而不會丟失代碼中的面向對象編程風格。
切勿在類模型中訪問外鍵。 外鍵由NHibernate管理,在面向對象的模型中不存在。
通過將多對一映射設置為insert =“ false”和update =“ false”,然后將CompanyId屬性添加到網站映射來解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.