C# 在NHibernate中执行Oracle PL/SQL存储过程

C# 在NHibernate中执行Oracle PL/SQL存储过程,c#,oracle,nhibernate,C#,Oracle,Nhibernate,首先,对不起我的英语 我现在正在创建Oracle数据库,其中所有DML都打包到存储过程中(例如,客户端不能直接执行“插入到项目中(…”,它必须调用SP“ArticleInsert()”)。数据库还具有自己的安全系统-特殊表,如“Users”、“Privileges”、“Users\u Privileges”。当我建立与数据库的连接时,我必须执行特殊的存储过程才能“登录到系统”,例如“登录(数据库用户,用户密码)”。在此数据库“知道”之后,我是谁,知道我的权限 我计划使用NHibernate编写C

首先,对不起我的英语

我现在正在创建Oracle数据库,其中所有DML都打包到存储过程中(例如,客户端不能直接执行“插入到项目中(…”,它必须调用SP“ArticleInsert()”)。数据库还具有自己的安全系统-特殊表,如“Users”、“Privileges”、“Users\u Privileges”。当我建立与数据库的连接时,我必须执行特殊的存储过程才能“登录到系统”,例如“登录(数据库用户,用户密码)”。在此数据库“知道”之后,我是谁,知道我的权限

我计划使用NHibernate编写C#中的客户端应用程序。但是每次修改新对象时,这个ORM都使用池中的新数据库连接。那么,我什么时候编写 类“Article”和superss标准NHib DML行为(“插入/更新/删除”将替换为执行专用存储过程),当NHibernate从池中调用新的db连接时,如何执行“Login(database\u user,user\u password)”呢

或者这些任务是如何解决的



谢谢

我认为您正在重新发明轮子。Oracle允许与任何RDBMS一样精细的记录访问粒度,而且比您可能需要的还要多。您为什么不使用这种能力来设置数据权限


无论如何,对于CRUD操作,是的,您可以通过为Insert、Update和Delete操作指定存储过程来覆盖NHibernate的默认SQL生成。查询必须符合NH的条件;通过调用检索存储过程强制延迟加载对象的每个字段和子项,您绕过了NHibernate 90%的能力。因此,您至少需要重新设计您的安全性,以便在必要时允许经过身份验证的用户在架构/表上选择权限。

我认为您有点在重新设计轮子。Oracle允许与任何RDBMS一样精细的记录访问粒度,并且比您可能需要的更精细。您为什么不使用这种能力来设置数据权限


无论如何,对于CRUD操作,是的,您可以通过为Insert、Update和Delete操作指定存储过程来覆盖NHibernate的默认SQL生成。查询必须符合NH的条件;通过调用检索存储过程强制延迟加载对象的每个字段和子项,您绕过了NHibernate 90%的能力。因此,您至少需要重新设计您的安全性,以便在必要时允许经过身份验证的用户在架构/表上选择权限。

这不是第一轮,我正在重新发明,因为缺乏知识,:)

假设我们为某个组织实施了人力资源管理系统。这个组织由一组部门组成,这些部门有自己的子部门等等。因此,我们有层次结构,每个部门至少有三个属性: -身份证 -家长ID(家长部门的ID) -名字

例如,我们在数据库中有SP-DeptChangeName(Id,NewName),我们希望一个db用户只能更改Id=112的部门及其子部门的名称,而另一个用户只能更改Id=34的部门及其子部门的名称。因此,权限不仅是“executedeptchangename”,而且是“executedeptchangename,ID=112或其子项”

另一个示例-用户“Xxx”可以在ID=112下创建深度不确定的新子部门


如果这些情况可以通过Oracle means解决,而不需要“手工风团”,你能给我一个适合谷歌的链接或短语吗?

这不是第一个轮子,我正在重新发明,因为缺乏知识,:)

假设我们为某个组织实施了人力资源管理系统。这个组织由一组部门组成,这些部门有自己的子部门等等。因此,我们有层次结构,每个部门至少有三个属性: -身份证 -家长ID(家长部门的ID) -名字

例如,我们在数据库中有SP-DeptChangeName(Id,NewName),我们希望一个db用户只能更改Id=112的部门及其子部门的名称,而另一个用户只能更改Id=34的部门及其子部门的名称。因此,权限不仅是“executedeptchangename”,而且是“executedeptchangename,ID=112或其子项”

另一个示例-用户“Xxx”可以在ID=112下创建深度不确定的新子部门


如果这些情况可以用Oracle means解决,而不需要“手工制作小麦”,你能给我一个适合Google的链接或短语吗?

我想他有插入/更新/删除的观点,如果严格的Oracle DBA只允许应用程序运行少量存储,对于选择我完全同意你,我会让NH这样做,它做得很好:)当然,SELECT操作将使用标准的NHibernate方法执行,而不是通过SP。存储过程仅用于创建/更新/删除。我认为他有插入/更新/删除的观点,以防严格的Oracle DBA只允许应用程序运行少量存储,对于SELECT,我完全同意你的意见,我会让NH来执行,当然,SELECT操作将使用标准的NHibernate方法执行,而不是通过SP执行。存储过程仅用于创建/更新/删除。