2011-07-09 23 views
4

从我已阅读的有关类型提供者的信息来看,我不知道他们是否可以用来为F#实现一个很好的ORM。F#类型提供程序是否提供了实现对象关系映射的良好基础?

我想数据库行可以由具有正确类型属性的对象表示,允许对列值进行类型安全的读写访问,类型提供者实现在编译时自动检查当前数据库模式。

这是一个现实和有用的场景?

+0

+1好问题。仍在等待技术来简化和改进ORM。也许类型提供者会帮忙? – Daniel

+0

@Daniel - 你有没有使用过Linq-to-Sql?我认为它很棒(至少在C#实现中,F#实现似乎没有准备好黄金时段)。我不喜欢实体框架/ Hibernate重型ORMS:我认为关系模型作为一种灵活,高效,可查询的存储模型是非常合适的,我无法理解过早地通过上下文抽象化其权力的愿望,前端对象映射(超出1对1表映射以进一步即席查询)。我觉得,在RDBMS实现和SQL中,痛苦很大,而Linq-to-Sql则治愈了很多。 –

+0

@Stephen:大多数ORM提供(可能是因为大多数开发人员需要)他们数据的静态表示。我宁愿有动态性(例如,如果我添加一列,ORM应该“拾起它”;我不应该重新编码)。正因为如此,我没有花太多时间用Linq-to-Sql。看起来像使用'System.Dynamic.DynamicObject'这样的语法来实现我想要的语法行为是微不足道的,但是这留下了更复杂的部分来处理:RDBMS实现细节。 – Daniel

回答

1

如果我是正确的,那么类型提供者将是F#编译器的“插件”。它们将插入F#编译器在编译代码时无法找到的类型信息。所以基本上在编译F#代码时,编译器会要求类型提供者填写F#编译器不知道的类型信息。这也意味着它仍然是静态类型,即类型在编译时被识别。

如果上述理解是正确的,那么在ORM的情况下,您将需要为您的关系方案实现一个类型提供程序,并且此类型提供程序将被F#编译器用来编译您的代码以“填充”代表你的ORM映射的类型。

如果你看看ORM,它们不仅仅是将关系数据映射到对象,还提供了各种操作,比如查询,更新底层关系数据等。在我看来,我不认为在这一刻F#类型提供商是好的ORM,但我可能是错的:)

+1

是的,我知道类型提供者不会提供ORM的实际功能。但是我想知道,如果不使用代码生成,它们会对静态类型安全的ORM有用。 – wmeyer

+0

但是,您确实使用ORM生成的代码获得了类型安全性。不是吗? – Ankur