共通の型を拡張するいくつかの型があり、これらは私のモデルです。
次に、CRUD 操作のモデル タイプごとに DAO タイプを用意します。
任意のモデル タイプから ID を検索できる関数が必要になったので、その他の関数用に新しいタイプを作成しました。
問題は、これらのタイプを注文する方法がわからないことです。現在、私は dao の前にモデルを持っていますが、どういうわけかDAOMisc
beforeCityDAO
とCityDAO
beforeが必要ですDAOMisc
が、これは不可能です。
簡単なアプローチは、この関数を各 DAO に配置し、その前に来ることができる型のみを参照することです。したがって、との外部キー関係があるasの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
ここに 1 つの dao タイプがあります。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# で共分散/反分散を実行できるとよいので、その制限を回避する必要がありました。