2014-03-03 95 views
2

以下多對一映射工作(從NorthBreeze拍攝):微風+ NHibernate的許多一對一的關係,避免指定關係鍵

public partial class UserRole 
{ 
    public virtual long ID { get; set; } 
    public virtual long UserId { get; set; } 
    public virtual long RoleId { get; set; } 

    public virtual User User { get; set; } 
    public virtual Role Role { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Models.NorthwindIB.NH" assembly="Model_NorthwindIB_NH"> 
    <class name="UserRole" table="`UserRole`" dynamic-update="true" optimistic-lock="dirty"> 
    <id name="ID" column="`ID`" type="long" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="User" column="`UserId`" class="User" /> 
    <many-to-one name="Role" column="`RoleId`" class="Role" /> 
    <property name="UserId" type="long" not-null="true" insert="false" update="false" /> 
    <property name="RoleId" type="long" not-null="true" insert="false" update="false" /> 
    </class> 
</hibernate-mapping> 

我怎樣才能讓這種多對一的工作(沒有在模型中指定用戶ID和角色ID屬性):

public partial class UserRole 
{ 
    public virtual long ID { get; set; } 

    public virtual User User { get; set; } 
    public virtual Role Role { get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Models.NorthwindIB.NH" assembly="Model_NorthwindIB_NH"> 
    <class name="UserRole" table="`UserRole`" dynamic-update="true" optimistic-lock="dirty"> 
    <id name="ID" column="`ID`" type="long" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="User" column="`UserId`" class="User" not-null="true" /> 
    <many-to-one name="Role" column="`RoleId`" class="Role" not-null="true" /> 
    </class> 
</hibernate-mapping> 

錯誤拋出: 找不到匹配FK財產Models.NorthwindIB.NH.UserRole.User

難道這可以以某種方式在未來版本的BreezeJs中處理,或者目前有沒有在模型中指定這些鍵的方法?還是有更多的比我所看到的?

編輯(非官方解決方案): 謝謝你指導我們在正確的方向。由於這是我們想要照顧的,我們根據Steve Schmitt所說的做了一些修改。

這裏有一個改變的鏈接,所以你可以看到我們如何解決這個問題,所以它可以幫助其他任何人。 (請注意,此代碼只適用於NHibernate的)

https://github.com/maca88/Breeze/commit/7a80c35cf0b20b5cffdef6d2eddeccd1bdeb3735

+0

你的錯誤在哪裏出現?初看起來,映射看起來沒問題。 – Rippo

+0

僅當使用第二個示例時,纔會在元數據生成上拋出錯誤,因爲我們沒有爲該類中的關係(用戶和角色)指定鍵。我明白爲什麼會有錯誤,但我想知道是否有一種方法可以製作模型,而無需在其中指定關係鍵。 – RagingTroll

+0

對不起,我不是100%清楚錯誤發生在哪裏。你是說當你建立會話工廠或這是一個微風錯誤? – Rippo

回答

1

沒有,但我們打算解決這個問題。正如你和Rippo所瞭解的那樣,問題在於Breeze需要客戶端上的FK才能工作。他們還需要在SaveChanges處理期間重新連接服務器上的實體。

我們的想法(至今未嘗試過)是:

  1. ,他們不會在真實模型存在創建元數據所需的外鍵的屬性。這些將以某種方式被標記爲「合成」('$'前綴,特殊屬性等)。
  2. 在JSON序列化過程中,從相關實體或NH代理填充合成外鍵。
  3. 在JSON反序列化過程中(保存時),將合成外鍵信息與實體一起攜帶,因此可用於重建關係或創建NH代理。

不是一個簡單的練習。我們認識到對於擁有現有N/Hibernate模型的開發人員來說非常重要,並且不希望修改它們以使用Breeze。

+0

謝謝你的回答。根據你寫的內容,我們製作了我們自己的解決方案,我把它發佈在原始問題上。 – RagingTroll

+0

Niiice!看起來你把所有的東西都放到了位置 - 而且很快,我可能會補充一些。它工作正常嗎?這當然是別人會覺得有用的東西。 –

+0

對於我們在NorthBreeze測試用例上進行的有限測試,它效果很好!在我們確定之前,它仍然需要一些更嚴重的測試。如果遇到任何錯誤,我們會相應地更新GitHub。 – RagingTroll

0

我已經下載NorthBreeze,並採取了快速查找。 Breeze有一個FK map的概念,我懷疑FK需要鏈接實體。

按照docs ......

微風協會要求外鍵。

這意味着所有外鍵都需要在微風中暴露以允許導航/檢索相關實體。在你的例子中,它很可能允許微風列出用戶及其相關角色。

<property name="UserId" ... insert="false" update="false" /> 
<property name="RoleId" ... insert="false" update="false" /> 

這些外鍵的NHibernate映射禁止直接更改這些鍵。因此,我會離開映射,因爲它不會對代碼庫造成任何明顯的影響。

Breeze meta data

+0

我知道爲什麼會有錯誤,我做錯了什麼來調用它,以及如何修復它,以便它能夠正常工作。但是,所有這些都不是我文章的重點,關鍵是讓AROUND必須在模型本身中指定主鍵。我正在尋找一種智能的方式將這個「功能」添加到Breeze中,或者如果在開發團隊的更新版本的Breeze中添加這樣的功能。 – RagingTroll

+0

你讀過答案了嗎?我很抱歉,這不是你想聽到的。沒有它不可能,因爲Breeze爲導航目的創建了FK地圖,並且映射中暴露了「需要」FK。 – Rippo

+0

我的答案是由你的最終評論'形成的,還是比我看到的更多嗎?' – Rippo