TLDR – 这是EF和NHibernate之间更好的选择,如果你知道它需要与oracle db一起工作,运行时动态模式更改,某些表没有主键,学习曲线不能太长.
我们编写了一个MVC 4应用程序,它使用EF从数据库中检索数据.我们知道进入这个项目我们的一些表没有主键(有些表不会得到它们)所以我们还有一个持久性项目来对没有主键的表运行常规查询.这是我们围绕主键问题的解决方案,但我读到NHibernate更宽容,并且有一些解决没有主键的表的工作.是这样的吗?
向我提出了一个问题,即我们是否能够根据客户登录的情况在运行时更改架构.每个客户将拥有相同的表集,但它们具有单独的架构.这是出于安全目的.这些表永远不会有所不同,因此我们将使用一个“主”模式来生成我们的poco并在dev中构建.但是,当部署应用程序时,客户登录并且他们应该只能从各自架构中的表中检索订单.这可以通过更改上下文中使用的模式来完成…除非有人有更好的建议这样做?基本上,我们希望根据用户所属的客户更改哪些表连接,但仍然能够查看模型设计器中的所有实体,并在解决方案内部生成poco.
我们使用oracle作为我们的数据库提供程序并使其与EF一起使用,但是EF需要第三方工具才能工作,而NHibernate与oracle开箱即用.既然我们有一个oracle DB,我们是否应该通过EF查看其他ORM工具,或者EF仍然是一个强大的工具,无论如何?
就像我说的,我们已经有一个运行EF的模拟应用程序.这是相对简单易懂的.在我们完成架构设计和背骨设计之后,团队的其他成员可以很容易地根据我的经验潜入并使用EF.这可能是因为有大量的参考资料可供使用,甚至教程项目也显示EF与MVC一起使用.我已经发现很难找到NHibernate的良好文档和支持.有没有人因为缺乏文档而感到沮丧,因为决定忘记所有关于NHibernate的ORM工具,并且其他开发人员难以快速学习它吗?
PS.上面这个大胆的问题是迄今为止我无法解决的最令人沮丧的事情,也是我将NHibernate视为替代解决方案的原因.如果您可以提出一个允许我在运行时动态更改架构的解决方案,那么我可以忘记NHibernate的所有内容.所以,如果没有其他我真的在寻找大胆的部分来得到答案.
提前感谢您的帮助
最佳答案 “模式”这个词在这里可能有点含糊不清.它可以引用代码中的整个映射集等,也可以引用连接字符串中指定的oracle模式.
你的其他评论让我假设后者.
我不能对EF做出太多评论,但是对于NHibernate,你很幸运:
SessionFactory类下的一个OpenSession()函数接受一个IDBConnection对象.
所以它可以像这样工作:
>在应用程序启动时,您将创建会话工厂.这将在应用程序级别解析和缓存所有映射元数据
>所有NHibernate数据库工作都是通过Session对象完成的.一旦您的用户登录,对于每个请求/响应周期(或操作 – >视图),您将从SessionFactory获得一个新会话.大多数人都使用单个连接字符串和驱动程序配置会话工厂,但在您的情况下,您将使用特定于用户的连接字符串创建连接并将其传递给SessionFactory.OpenSession.在你进一步深入之前,值得阅读NHibernate的“作为工作单元的会话”概念以及调查会话管理.
此外,是的NHibernate在处理现有数据库时可以非常灵活.我不认为它可以在没有任何形式的密钥的情况下工作(如果你正在更新数据库记录,NHibernate需要从数据库中可靠地访问该记录),但它可以使用复合密钥.