Breeze + NHibernate多对一关系,避免必须指定关系键

时间:2014-03-03 12:21:44

标签: c# .net nhibernate breeze

以下多对一映射正在运行(取自NorthBreeze):

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>

如何使这种多对一工作(没有在模型中指定UserId和RoleId属性):

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

2 个答案:

答案 0 :(得分:1)

不,但我们打算解决这个问题。正如您和Rippo所了解的那样,问题在于客户端需要FK才能使Breeze工作。在SaveChanges处理期间,还需要重新连接服务器上的实体。

我们的想法(尚未尝试过)是:

  1. 在元数据中创建必要的外键属性,它们在真实模型中不存在。这些将以某种方式标记为“合成”('$'前缀,特殊属性等)。
  2. 在JSON序列化过程中,从相关实体或NH代理填充合成外键。
  3. 在JSON反序列化过程中(保存时),将合成外键信息与实体一起携带,以便可以用来重建关系或创建NH代理。
  4. 不是一项微不足道的练习。我们意识到这对于拥有现有N / Hibernate模型且不想修改它们以使用Breeze的开发人员来说非常重要。

答案 1 :(得分:0)

我已下载NorthBreeze并快速查看。 Breeze有一个FK map的概念,我怀疑需要FK来链接实体。

根据docs ...

  

Breeze协会需要外键。

这意味着所有外键都需要在微风中暴露,以便允许导航/检索相关实体。在您的示例中,它最有可能允许breeze列出用户及其相关角色。

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

这些外键的NHibernate映射禁止这些键直接更改。因此,我会保留映射,因为它不会对代码库造成任何明显的影响。

Breeze meta data