首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似实体框架的对象关系映射不适用于.NET

类似实体框架的对象关系映射不适用于.NET
EN

Stack Overflow用户
提问于 2009-08-16 07:03:56
回答 3查看 431关注 0票数 2

我真正喜欢实体框架的是它的拖放方式,它可以构成应用程序的整个模型层。你选择这些表,它就会连接它们,你就完成了。如果您更新数据库scheda,右键单击-> update,您将再次完成更新。

在我看来,这似乎远远领先于与之竞争的or,就像XML (n)Hibernate所需的混乱或难以更新的Django模型。

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-16 12:13:10

SQLAlchemy数据库反射让你走了一半的路。你仍然需要声明你的类和它们之间的关系。实际上,您也可以很容易地自动生成类,但您仍然需要以某种方式命名这些关系,因此您最好手动声明这些类。

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

代码语言:javascript
复制
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')

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-08-24 10:54:54

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

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

但是,每次修改代码或更改数据库模式时,必须创建/编辑xml配置文件并不是一件好事,您必须更新映射文件。开始使用映射文件和跟踪看似简单的问题也非常困难,可能需要花费很长时间。

还有另外两个选项:

使用像CodeSmith这样的代码生成器,它为许多对象关系管理系统提供了模板。当(不是如果)需要自定义输出时,您可以编辑模板,但简单的情况会为您处理。这样,您就可以在每次更改数据库模式时重新运行代码生成器,并获得可重复的结果。

和/或使用fluent接口(例如Fluent NHibernate)来配置您的ORM系统,这避免了对Xml配置文件的需要,并且在大多数情况下,您可以使用命名约定来将字段链接到列等。

另一种选择是使用一个模型,您可以从中生成数据库和代码。“model”是您的源代码,并且处于版本控制之下。这就是所谓的“模型驱动开发”,如果你有很多具有更简单模式的类,这会很棒,因为你只需要为每个模式创建一次模板。

票数 2
EN

Stack Overflow用户

发布于 2009-08-25 01:06:09

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

就我个人而言,我仍然喜欢Linq2Sql。是的,第一次有人需要在表格上删除和重新拖动似乎是太多的工作,但实际上并非如此。当你保存时,它没有更新你的类代码,这真的是一件痛苦的事情,但你只需控制你的表,并再次将它们拖过来。完全翻拍是非常快速和无痛的。它创建的类非常简单。如果您喜欢使用SP进行CRUD,您甚至可以创建多个表实体。

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

很多人想方设法将IQueryable从存储库中移除,但您可以限制您在linq2Sql中链接的内容,因此IQueryable并不是太糟糕。

仔细想想,我想知道是否有一种方法可以限制关系(和外键)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1283646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档