小编Die*_*ego的帖子

在ORM模型中处理脏状态的最佳方法

我不希望任何人说"你不应该重新发明轮子,使用开源ORM" ; 我有一个立即的要求,不能切换.

我正在做一些支持缓存的ORM.即使不支持缓存,我仍然需要此功能,以便知道何时将对象写入存储.模式是DataMapper.

这是我的方法:

  • 我想避免运行时内省(即猜测属性).
  • 我不想使用CLI代码生成器生成getter和setter(实际上我使用NetBeans,使用ALT + INSERT).
  • 我希望模型最接近POPO(普通的旧PHP对象).我的意思是:私有属性,每个属性的"硬编码"getter和setter.

我有一个名为AbstractModel所有模型继承的抽象类.它有一个isDirty()名为is_dirty的私有(也可以保护,如果需要)的属性调用的公共方法.它必须返回true或false,具体取决于对象数据是否有更改,因为它已加载.

问题是:有没有办法"is_dirty"在每个setter中编译内部标志而不编码$this->is_dirty = true?我的意思是:$this->attr = $value除了业务逻辑需要更改代码之外,我希望大多数时间都有setter .

其他限制是我不能依赖,__set因为在具体的模型类中,属性已经作为私有存在,因此__set永远不会在setter上调用.

有任何想法吗?其他ORM的代码示例被接受.

我的一个想法是修改NetBeans setters模板,但我认为应该有一种方法可以在不依赖IDE的情况下执行此操作.

我的另一个想法是创建setter,然后用下划线或其他东西更改private属性的名称.这样setter会调用__set并在那里处理一些代码来处理"is_dirty"标志,但是这会破坏POPO概念,而且很难看.

php oop model-view-controller orm

5
推荐指数
1
解决办法
3710
查看次数

在 SQLite 上转换表达式结果,从浮点数到十进制数

我在使用 SQLite.NET 对 SQLite 数据库运行的查询上有以下表达式。

SUM(Detail.Qty * Products.Weight) AS MovedWeight
Run Code Online (Sandbox Code Playgroud)

查询有效,但由于 Detail.Qty 是十进制,而 Weight 也是十进制,它返回一个浮点数。我正在尝试将其转换为 DECIMAL(10,2) 之类的内容。我知道 SQLite 对数据类型很特别,我确实尝试使用 CAST 但没有成功。

CAST(SUM(Detail.Qty * Products.Weight) AS DECIMAL(10,2)) AS MovedWeight
Run Code Online (Sandbox Code Playgroud)

它也可以工作,但没有注意精度 (10,2),并给我与第一个示例相同的结果。

有人有想法吗?在 DataTable 中将结果转换为十进制也是可以接受的,但我不知道如何在没有丑陋、消耗资源的循环的情况下做到这一点(预计查询在某个时候将返回 3000 或更多结果)。

c# sql sqlite casting

3
推荐指数
2
解决办法
7809
查看次数

标签 统计

c# ×1

casting ×1

model-view-controller ×1

oop ×1

orm ×1

php ×1

sql ×1

sqlite ×1