LocalDb
Provides a wrapper around SqlLocalDB to simplify running tests against Entity Framework or a raw SQL Database.
SqlLocalDB is only supported on Windows
Contents
- Why
- References:
- Usage
- Debugging
- SqlLocalDb
- ReSharper Test Runner
- Credits
- Design
- Raw Connection Usage
- EntityFramework Classic Usage
- EntityFramework Core Usage
- EntityFramework Core Migrations
- Directory and name resolution
- Sql Management Studio
- Logging
- Template database size
- Template Re-generation
NuGet packages
- https://www.nuget.org/packages/LocalDb/
- https://www.nuget.org/packages/EfLocalDb/
- https://www.nuget.org/packages/EfClassicLocalDb/
Why
Goals:
- Have a isolated SQL Server Database for each unit test method.
- Does not overly impact performance.
- Results in a running SQL Server Database that can be accessed via SQL Server Management Studio (or other tooling) to diagnose issues when a test fails.
Why not SQLite
- SQLite and SQL Server do not have compatible feature sets and there are incompatibilities between their query languages.
Why not SQL Express or full SQL Server
- Control over file location. SqlLocalDB connections support AttachDbFileName property, which allows developers to specify a database file location. SqlLocalDB will attach the specified database file and the connection will be made to it. This allows database files to be stored in a temporary location, and cleaned up, as required by tests.
- No installed service is required. Processes are started and stopped automatically when needed.
- Automatic cleanup. A few minutes after the last connection to this process is closed the process shuts down.
- Full control of instances using the Command-Line Management Tool: SqlLocalDB.exe.
EntityFramework InMemory
Why not- Difficult to debug the state. When debugging a test, or looking at the resultant state, it is helpful to be able to interrogate the Database using tooling
- InMemory is implemented with shared mutable state between instance. This results in strange behaviors when running tests in parallel, for example when creating keys.
- InMemory is not intended to be an alternative to SqlServer, and as such it does not support the full suite of SqlServer features. For example:
- Does not support Timestamp/row version.
- Does not validate constraints.
See the official guidance: InMemory is not a relational database.
References:
- Which Edition of SQL Server is Best for Development Work?
- Introducing SqlLocalDB, an improved SQL Express
- SQL LocalDB 2019 Download
Usage
This project supports several approaches.
Raw SqlConnection
Interactions with SqlLocalDB via a SqlConnection.
EntityFramework Classic
Interactions with SqlLocalDB via Entity Framework Classic.
EntityFramework Core
Interactions with SqlLocalDB via Entity Framework Core.
Debugging
To connect to a SqlLocalDB instance using SQL Server Management Studio use a server name with the following convention (LocalDb)\INSTANCENAME
.
So for a instance named MyDb
the server name would be (LocalDb)\MyDb
. Note that the name will be different if a name
or instanceSuffix
have been defined for SqlInstance.
The server name will be written to Trace.WriteLine when a SqlInstance is constructed. It can be accessed programmatically from SqlInstance.ServerName
. See Logging.
SqlLocalDb
The SqlLocalDb Utility (SqlLocalDB.exe) is a command line tool to enable users and developers to create and manage an instance of SqlLocalDB.
Useful commands:
sqllocaldb info
: list all instancessqllocaldb create InstanceName
: create a new instancesqllocaldb start InstanceName
: start an instancesqllocaldb stop InstanceName
: stop an instancesqllocaldb delete InstanceName
: delete an instance (this does not delete the file system data for the instance)
ReSharper Test Runner
The ReSharper Test Runner has a feature that detects spawned processes, and prompts if they do not shut down when a test ends. This is problematic when using SqlLocalDB since the Sql Server process continues to run:
To avoid this error spawned processes can be ignored:
Credits
SqlLocalDB API code sourced from https://github.com/skyguy94/Simple.LocalDb
Icon
Robot designed by Creaticca Creative Agency from The Noun Project.