ORM用于具有半灵活架构设计的数据库

c# dapper orm petapoco sql

我喜欢Dapper,Massive,PetaPoco等的“微观”方法,我喜欢控制我们发送到数据库的SQL,大部分时间它都比较简单。我也喜欢使用POCO,但是在处理有点灵活的架构设计时,你经常会遇到麻烦:)

假设我们有一个Person实体,它总是具有以下属性。

  • ID
  • 名称
  • 电子邮件
  • 电话

但在某些情况下,可能会有其他属性,如

  • SpecialPhoneNumber
  • VeryCustomValue

我真的很喜欢POCO,它具有我们知道的常见属性。但是在密钥/值集合中可以访问其他对象。

什么是最好的方法?并且所提到的任何“mirco-orm”都支持这个吗?我已经看了他们所有,但没有发现任何迹象表明他们这样做,但也许我错过了一些东西。

是否可以直接使用SqlDataReader执行此操作?或者在使用反射来创建对象时,读取数百行的性能会不好?所提到的orm似乎都做得很好,我想在下面使用DataReader。

希望你能帮忙:)

编辑:我应该提一下,我们无法控制应用程序架构。这是一个ERP解决方案,允许个人客户定制他们的应用程序和底层数据库。在应用程序中添加字段会在数据库中添加列。不好意思!首先不要说清楚

一般承认的答案

Massive可以支持这一点,因为它将数据实现为ExpandoObject的:

秘诀就是ExpandoObject。所有内容和Massive产生的一切都是一个Expando - 它可以让你用它做任何你想做的事。在它的核心,ExpandoObject只是一个IDictionary <string,object>

ExpandoObject实现IDictionary<string, Object>IEnumerable<KeyValuePair<string, Object>> ,因此您可以以任何方式枚举和测试成员。

Massive的默认设置是发出SELECT *查询,因此ExpandoObject将包含表中的所有字段,即使是那些您不知道的字段。

你可以从Github获得Massive的当前代码

Dapper也可以选择动态对象,但与Massive不同,它只能选择数据,不能插入,更新或删除它。编辑:审查Dapper文档,它似乎可以执行修改,因为它可以执行任何SQL。有一些关于使用Dapper执行插入的最新信息


热门答案

你可以看看nHibernate的动态映射。

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

它允许您将这些扩展属性检索到通用Directory<string,object> 。因此,您的类具有此类通用包(字典)并动态扩展XML映射。

nHibernate将为您完成剩下的工作。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow