2014-03-03 76 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