How Do I Use LiteDB?
The default template uses in-memory storage. This recipe will show you how to replace the in-memory storage with LiteDB in the form of LiteDB.FSharp.
If you're using the minimal template, the first steps will show you how to add a LiteDB database; the remaining section of this recipe are designed to work off the default template's starter app.
1. Add LiteDB.FSharp
Add the LiteDB.FSharp NuGet package to the server project.
2. Create the database
Replace the use of the ResizeArray
in the Storage
type with a database and collection:
open LiteDB.FSharp
open LiteDB
type Storage () =
let database =
let mapper = FSharpBsonMapper()
let connStr = "Filename=Todo.db;mode=Exclusive"
new LiteDatabase (connStr, mapper)
let todos = database.GetCollection<Todo> "todos"
LiteDb is a file-based database, and will create the file if it does not exist automatically.
This will create a database file Todo.db
in the Server
folder. The option mode=Exclusive
is added for MacOS support (see this issue).
See here for more information on connection string arguments.
See the official docs for details on constructor arguments.
3. Implement the rest of the repository
Replace the implementations of GetTodos
and AddTodo
as follows:
/// Retrieves all todo items.
member _.GetTodos () =
todos.FindAll () |> List.ofSeq
/// Tries to add a todo item to the collection.
member _.AddTodo (todo:Todo) =
if Todo.isValid todo.Description then
todos.Insert todo |> ignore
Ok ()
else
Error "Invalid todo"
4. Initialise the database
Modify the existing "priming" so that it first checks if there are any records in the database before inserting data:
if storage.GetTodos() |> Seq.isEmpty then
storage.AddTodo(Todo.create "Create new SAFE project") |> ignore
storage.AddTodo(Todo.create "Write your app") |> ignore
storage.AddTodo(Todo.create "Ship it !!!") |> ignore
5. Make Todo compatible with LiteDb
Add the CLIMutable attribute to the Todo
record in Shared.fs
[<CLIMutable>]
type Todo =
{ Id : Guid
Description : string }
This is required to allow LiteDB to hydrate (read) data into F# records.
All Done!
- Run the application.
- You will see that a database has been created in the Server folder and that you are presented with the standard TODO list.
- Add an item and restart the application; observe that your data is still there.