我真正喜欢实体框架的是它的拖放方式,它可以构成应用程序的整个模型层。你选择这些表,它就会连接它们,你就完成了。如果您更新数据库scheda,右键单击-> update,您将再次完成更新。
在我看来,这似乎远远领先于与之竞争的or,就像XML (n)Hibernate所需的混乱或难以更新的Django模型。
如果不关注这样一个事实,即有时更多地控制映射过程可能是好的,那么对于其他(主要是开源,如python或php)编程语言或框架,是否有类似的一键式(或一命令)解决方案?
谢谢
发布于 2009-08-16 12:13:10
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'))发布于 2009-08-24 10:54:54
我不喜欢“拖放”创建数据访问代码。
乍一看,这似乎很简单,但随后您对数据库进行了更改,并且必须更新数据访问代码。这就是它变得困难的地方,因为你经常必须重做你以前做过的事情,或者手动编辑拖放设计器创建的代码。通常,当您使用拖放设计器对一个字段映射进行更改时,输出文件具有不相关的行更改,因此您不能使用源代码控制系统来确认您已经进行了预期的更改(并且不更改任何其他内容)。
但是,每次修改代码或更改数据库模式时,必须创建/编辑xml配置文件并不是一件好事,您必须更新映射文件。开始使用映射文件和跟踪看似简单的问题也非常困难,可能需要花费很长时间。
还有另外两个选项:
使用像CodeSmith这样的代码生成器,它为许多对象关系管理系统提供了模板。当(不是如果)需要自定义输出时,您可以编辑模板,但简单的情况会为您处理。这样,您就可以在每次更改数据库模式时重新运行代码生成器,并获得可重复的结果。
和/或使用fluent接口(例如Fluent NHibernate)来配置您的ORM系统,这避免了对Xml配置文件的需要,并且在大多数情况下,您可以使用命名约定来将字段链接到列等。
另一种选择是使用一个模型,您可以从中生成数据库和代码。“model”是您的源代码,并且处于版本控制之下。这就是所谓的“模型驱动开发”,如果你有很多具有更简单模式的类,这会很棒,因为你只需要为每个模式创建一次模板。
发布于 2009-08-25 01:06:09
我听说iBattis很棒。当他们的程序员团队不能理解Hibernate (时间问题)时,一些公司会退回到iBattis。
就我个人而言,我仍然喜欢Linq2Sql。是的,第一次有人需要在表格上删除和重新拖动似乎是太多的工作,但实际上并非如此。当你保存时,它没有更新你的类代码,这真的是一件痛苦的事情,但你只需控制你的表,并再次将它们拖过来。完全翻拍是非常快速和无痛的。它创建的类非常简单。如果您喜欢使用SP进行CRUD,您甚至可以创建多个表实体。
将SP链接到CRUD类似于EF:您只需使用与表相同的参数设置SP,然后将其拖到表上,然后扑通一声,它就会匹配数据类型。
很多人想方设法将IQueryable从存储库中移除,但您可以限制您在linq2Sql中链接的内容,因此IQueryable并不是太糟糕。
仔细想想,我想知道是否有一种方法可以限制关系(和外键)。
https://stackoverflow.com/questions/1283646
复制相似问题