代码之家  ›  专栏  ›  技术社区  ›  pistacchio

与ORM类似的实体框架,不适用于.NET

  •  2
  • pistacchio  · 技术社区  · 16 年前

    关于实体框架,我真正喜欢的是它组成应用程序整个模型层的拖放方式。选择表格,将它们连接起来,就完成了。如果更新数据库scheda,请右键单击->更新,然后再次完成。

    在我看来,这远远领先于竞争激烈的ORM,比如混乱的XML(n)Hibernate需要的或者难以更新的Django模型。

    如果不关注这样一个事实,即有时对映射过程的控制可能更好,那么对于其他(主要是开源的,如python或php)编程语言或框架,是否有类似的一键单击(或一个命令)解决方案?

    谢谢

    3 回复  |  直到 16 年前
        1
  •  2
  •   Ants Aasma    16 年前

    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')
    

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

    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
  •  2
  •   Ian Ringrose    16 年前

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

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

    但是,每次重新编译代码或更改数据库模式时,必须创建/编辑XML配置文件并不是一件好事,您必须更新映射文件。另外,很难开始映射文件和跟踪看似简单的问题可能需要很长时间。

    还有两种选择:

    使用类似的代码生成器 CodeSmith 它与许多ORM系统的模板一起提供。当(不是如果)你需要定制输出时,你可以编辑模板,但简单的情况会为你处理。这样,每次更改数据库模式并获得可重复的结果时,只需重新运行代码生成器。

    和/或使用Fluent接口(例如 Fluent NHibernate )要配置您的ORM系统,这就避免了对XML配置文件的需要,在大多数情况下,您可以使用命名约定将字段链接到列等。这将很难从拖放设计器开始,但如果您匹配代码或数据库的重构,则从长远来看是值得的。

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

        3
  •  0
  •   Zachary Scott    16 年前

    我听说伊巴提斯很好。当一些公司的程序员团队无法理解Hibernate(时间问题)时,他们会退回到IBattis。

    我个人还是喜欢 LIQ2SQL . 是的,第一次有人需要删除和重绘一个表时,看起来工作量太大了,但事实并非如此。保存时不更新类代码的时间确实很痛苦,但您只需控制表并再次将其拖过来。总的翻拍是非常迅速和无痛的。它创建的类非常简单。如果愿意,还可以使用SPforCRUD创建多个表实体。

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

    很多人不遗余力地把iqueryable从存储库中带走,但是你 可以 限制你 链接 在linq2sql中,所以iqueryable并不太差。

    想一想,我想知道是否有办法限制两国关系(以及外方的关系)。