我有一些扩展通用类型的类型,这些是我的模型。
然后,我为 CRUD 操作的每种模型类型提供了 DAO 类型。
我现在需要一个函数,它可以让我找到给定任何模型类型的 id,所以我为一些杂项函数创建了一个新类型。
问题是我不知道如何订购这些类型。目前我在 dao 之前有模型,但我不知何故需要DAOMisc
beforeCityDAO
和CityDAO
before DAOMisc
,这是不可能的。
简单的方法是将这个函数放在每个 DAO 中,仅引用可以出现在它之前的类型,因此,在它State
之前出现City
与State
具有外键关系City
,所以杂项函数会很短。但是,这让我觉得是错误的,所以我不确定如何最好地解决这个问题。
这是我的杂项类型,其中BaseType
是我所有模型的通用类型。
type DAOMisc =
member internal self.FindIdByType item =
match(item:BaseType) with
| :? StateType as i ->
let a = (StateDAO()).Retrieve i
a.Head.Id
| :? CityType as i ->
let a = (CityDAO()).Retrieve i
a.Head.Id
| _ -> -1
这是一种道类型。CommonDAO
实际上有 CRUD 操作的代码,但这在这里并不重要。
type CityDAO() =
inherit CommonDAO<CityType>("city", ["name"; "state_id"],
(fun(reader) ->
[
while reader.Read() do
let s = new CityType()
s.Id <- reader.GetInt32 0
s.Name <- reader.GetString 1
s.StateName <- reader.GetString 3
]), list.Empty
)
这是我的模型类型:
type CityType() =
inherit BaseType()
let mutable name = ""
let mutable stateName = ""
member this.Name with get() = name and set restnameval=name <- restnameval
member this.StateName with get() = stateName and set stateidval=stateName <- stateidval
override this.ToSqlValuesList = [this.Name;]
override this.ToFKValuesList = [StateType(Name=this.StateName);]
这个FindIdByType
函数的目的是我想找到外键关系的 id,所以我可以在我的模型中设置值,然后让 CRUD 函数使用所有正确的信息进行操作。因此,City
需要州名的 id,所以我会获取州名,将其放入state
类型中,然后调用此函数以获取该州的 id,因此我的城市插入还将包括外键的 id。
这似乎是最好的方法,以一种非常通用的方式处理插入,这是我正在尝试解决的当前问题。
更新:
在定义了所有其他 DAO 之后,我需要研究并查看是否可以以某种方式将 FindIdByType 方法注入 CommonDAO,就好像它是一个闭包一样。如果这是 Java,我会使用 AOP 来获得我正在寻找的功能,但不确定如何在 F# 中执行此操作。
最终更新:
在考虑了我的方法后,我意识到它有致命的缺陷,所以我想出了一个不同的方法。
这就是我将如何进行插入,我决定将这个想法放入每个实体类中,这可能是一个更好的想法。
member self.Insert(user:CityType) =
let fk1 = [(StateDAO().Retrieve ((user.ToFKValuesList.Head :?> StateType), list.Empty)).Head.Id]
self.Insert (user, fk1)
我还没有开始使用fklist
,但它是int list
,而且我知道每个列的名称,所以我只需要inner join
为选择做,例如。
这是泛化的基本类型插入:
member self.Insert(user:'a, fklist) =
self.ExecNonQuery (self.BuildUserInsertQuery user)
如果 F# 可以做协方差,那就太好了,所以我必须解决这个限制。