【问题标题】:Entity Framwework-like ORM NOT for .NET类似实体框架的 ORM 不适用于 .NET
【发布时间】:2009-08-16 07:03:56
【问题描述】:

我真正喜欢 Entity 框架的地方在于它构成应用程序整个模型层的拖放方式。您选择表格,它连接它们,您就完成了。如果您更新数据库计划,请右键单击 -> 更新,然后再次完成。

在我看来,这比竞争对手的 ORM 遥遥领先,例如 XML (n)Hibernate 要求的混乱或难以更新的 Django 模型。

如果不关注有时对映射过程进行更多控制可能会更好的事实,是否有类似的一键式(或一键式)解决方案适用于其他(主要是开源,如 python 或 php)编程语言或框架?

谢谢

【问题讨论】:

  • 实际上,整个框架使用“混乱”的 XML,就像 NHibernate 一样——只是它的创建是由 Visual Studio 自动完成的。所以看起来您正在寻找具有类似功能的 IDE 而不是 ORM。

标签: php python entity-framework open-source


【解决方案1】:

SQLAlchemy 数据库反射让你成功了一半。您仍然必须声明您的类和它们之间的关系。实际上,您也可以轻松地自动生成类,但您仍然需要以某种方式命名关系,因此您不妨手动声明类。

设置数据库的代码如下所示:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData(create_engine(database_url), reflect=True)
Base = declarative_base(metadata)    

class Order(Base):
    __table__ = metadata.tables['orders']

class OrderLine(Base):
    __table__ = metadata.tables['orderlines']
    order = relation(Order, backref='lines')

在生产代码中,您可能希望以某种方式缓存反射的数据库元数据。例如将其腌制到文件中:

from cPickle import dump, load
import os

if os.path.exists('metadata.cache'):
    metadata = load(open('metadata.cache'))
    metadata.bind = create_engine(database_url)
else:
    metadata = MetaData(create_engine(database_url), reflect=True)
    dump(metadata, open('metadata.cache', 'w'))

【讨论】:

    【解决方案2】:

    我不喜欢“拖放”创建数据访问代码。

    乍一看似乎很容易,但是您对数据库进行了更改并且必须更新数据访问代码。这就是变得困难的地方,因为您经常必须重做之前所做的事情,或者手动编辑拖放设计器创建的代码。通常,当您使用拖放设计器对一个字段映射进行更改时,输出文件会发生不相关的行更改,因此您无法使用源代码控制系统来确认您已经进行了预期的更改(并且不更改任何其他内容) .

    但是,每次重构代码或更改数据库架构时都必须创建/编辑 xml 配置文件,但您必须更新映射文件。开始映射文件和追踪看似简单的问题可能需要很长时间也非常困难。

    还有其他两种选择:

    使用像CodeSmith 这样的代码生成器,它带有适用于许多 ORM 系统的模板。当(不是如果)您需要自定义输出时,您可以编辑模板,但简单的情况会为您处理。这样,您每次更改数据库架构时只需重新运行代码生成器即可获得可重复的结果。

    和/或使用流畅的界面(例如Fluent NHibernate)来配置你的ORM系统,这避免了对Xml配置文件的需要,并且在大多数情况下你可以使用命名约定将字段链接到列等。这会更难首先是拖放设计器,但如果您对代码或数据库进行匹配重构,从长远来看会有所回报。

    另一种选择是使用您生成数据库和代码的模型。 “模型”是您的源代码,并受版本控制。这被称为“模型驱动开发”,如果您有许多具有更简单模式的类,这将非常有用,因为您只需为每个模式创建一次模板。

    【讨论】:

    • EF 设计者实际上是经过深思熟虑的。您可以为您在数据库中所做的更改运行更新,它不会弄乱您对架构/对象所做的手动更改。
    【解决方案3】:

    我听说 iBattis 不错。当他们的程序员团队无法理解 Hibernate(时间问题)时,一些公司会退回到 iBattis。

    我个人还是喜欢Linq2Sql。是的,第一次有人需要删除和重新拖动表格似乎工作量太大,但事实并非如此。保存时它不更新您的类代码的时间真的很痛苦,但您只需控制您的表格并再次将它们拖过来。完全重制非常快速且无痛。它创建的类非常简单。如果您喜欢使用 CRUD 的 SP,您甚至可以创建多个表实体。

    将 SP 链接到 CRUD 类似于 EF:您只需使用与表相同的参数设置您的 SP,然后将其拖到您的表上,然后噗,它与数据类型匹配。

    很多人不遗余力地将 IQueryable 从存储库中取出,但是您可以限制您在 linq2Sql 中链接的内容,因此 IQueryable 还不错.

    想一想,不知道有没有办法限制关系(和外键)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2010-10-29
      相关资源
      最近更新 更多