如果我有一个没有引用完整性或键的旧数据库,并且它使用存储过程进行所有外部访问,那么使用 nHibernate 持久化实体(对象图)有什么意义?
另外,SP 不仅包含 CRUD 操作,还包含业务逻辑......
我开始认为坚持使用自定义 ado.net DAL 会更容易:(
干杯
奥利
如果我有一个没有引用完整性或键的旧数据库,并且它使用存储过程进行所有外部访问,那么使用 nHibernate 持久化实体(对象图)有什么意义?
另外,SP 不仅包含 CRUD 操作,还包含业务逻辑......
我开始认为坚持使用自定义 ado.net DAL 会更容易:(
干杯
奥利
你很可能可以。但你可能不应该:-)
Hibernate 本身并不关心引用完整性;虽然它显然需要在关联表之间建立某种链接,但实际的 FK 约束是否存在并不重要。例如,如果Product
映射为many-to-one
,Vendor
表PRODUCTS
中应该有某种形式,VENDOR_ID
但它不必是 FK。
根据您的 SP 签名,您可能会也可能无法将它们用作映射中的自定义 CRUD;如果 SP 确实具有在所有 CRUD 操作期间应用的业务逻辑,那可能是您的第一个潜在问题。
最后,如果您的 SP 确实用于所有CRUD 操作(包括所有可能的查询),那么尝试将 Hibernate 引入混合可能是不值得的——您将几乎一无所获,并且您将拥有另一层处理。
好的,问题的一个例子是这样的:
SP 使用类似于以下的 sql 语句来选择下一个要插入到表的“Id”列中的 Id(该列只是一个 int 列,而不是一个标识列),
声明:'从客户中选择 @cus_id = max(id) + 1',
因此,一旦计算出下一个 id,它将与其他数据一起插入到表 A 中,然后将一行插入到表 B 中,其中表 A 的另一列上有表 A 的引用(无外键约束),然后最后插入一行使用与表 A 相同的引用进入表 C。
当我使用流利的 NH 将其映射到 NH 时,该映射为第一个表生成了正确的“插入”sql 语句,但是当第二个表被映射为“参考”时,生成了一个“更新”sql 语句,我期待看到一个“插入”声明...
现在没有身份列、没有键和没有参照完整性的事实对我来说意味着我不能保证关系是一对一、一对多等......
如果这是真的,NH(流利的)如何配置...
干杯
奥利