簡體   English   中英

NHibernate插入具有空多對一映射的新記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM