Skip to content

Commit 683c435

Browse files
Add EntityFrameworkSqlServerExtensions.CreateDatabase() method.
1 parent bd43454 commit 683c435

3 files changed

Lines changed: 78 additions & 3 deletions

File tree

src/Directory.Build.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1313
<PackageReleaseNotes>
1414
2.2.0
15+
- Add SqlServer.CreateDatabase() method to create database from an Entity Framework DbContext.
1516
- Add SqlServer.CreateEmptyDatabaseAsync() method.
1617
- Add SqlServer.DeleteDatabaseAsync() method.
1718
- Add SqlServer.ExecuteScriptAsync() method.

src/Testing.Databases.SqlServer.EntityFramework/EntityFrameworkSqlServerExtensions.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,33 @@ namespace PosInformatique.Testing.Databases.SqlServer
1515
public static class EntityFrameworkSqlServerExtensions
1616
{
1717
/// <summary>
18-
/// Deploy a database using a DACPAC file.
18+
/// Creates a database using the specified Entity Framework <paramref name="context"/>.
1919
/// </summary>
20-
/// <remarks>If a database already exists, it will be deleted.</remarks>
20+
/// <remarks>If the database already exists, it will be deleted.</remarks>
2121
/// <param name="server"><see cref="SqlServer"/> instance where the database will be created.</param>
2222
/// <param name="name">Name of the database to create.</param>
2323
/// <param name="context"><see cref="DbContext"/> which represents the database to create.</param>
2424
/// <returns>An instance of the <see cref="SqlServerDatabase"/> which represents the deployed database.</returns>
25+
public static SqlServerDatabase CreateDatabase(this SqlServer server, string name, DbContext context)
26+
{
27+
var database = server.GetDatabase(name);
28+
29+
context.Database.SetConnectionString(database.ConnectionString);
30+
31+
context.Database.EnsureDeleted();
32+
context.Database.EnsureCreated();
33+
34+
return database;
35+
}
36+
37+
/// <summary>
38+
/// Creates a database using the specified Entity Framework <paramref name="context"/>.
39+
/// </summary>
40+
/// <remarks>If the database already exists, it will be deleted.</remarks>
41+
/// <param name="server"><see cref="SqlServer"/> instance where the database will be created.</param>
42+
/// <param name="name">Name of the database to create.</param>
43+
/// <param name="context"><see cref="DbContext"/> which represents the database to create.</param>
44+
/// <returns>A <see cref="Task"/> which represents the asynchronous operation and contains an instance of the <see cref="SqlServerDatabase"/> that represents the deployed database.</returns>
2545
public static async Task<SqlServerDatabase> CreateDatabaseAsync(this SqlServer server, string name, DbContext context)
2646
{
2747
var database = server.GetDatabase(name);

tests/Testing.Databases.SqlServer.EntityFramework.Tests/EntityFrameworkSqlServerExtensionsTest.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public async Task Create_WithNoExistingDatabase()
2424
var server = new SqlServer(ConnectionString);
2525
server.DeleteDatabase(nameof(EntityFrameworkSqlServerExtensionsTest));
2626

27-
var database = await server.CreateDatabaseAsync(nameof(EntityFrameworkSqlServerExtensionsTest), dbContext);
27+
var database = server.CreateDatabase(nameof(EntityFrameworkSqlServerExtensionsTest), dbContext);
2828

2929
database.ConnectionString.Should().Be("Data Source=(localDB)\\posinfo-tests;Initial Catalog=EntityFrameworkSqlServerExtensionsTest;Integrated Security=True");
3030

@@ -52,6 +52,60 @@ public async Task Create_WithAlreadyExistingDatabase()
5252

5353
emptyDatabase.ExecuteNonQuery("CREATE TABLE [MustBeDeleted] ([Id] INT)");
5454

55+
var database = server.CreateDatabase(nameof(EntityFrameworkSqlServerExtensionsTest), dbContext);
56+
57+
database.ConnectionString.Should().Be("Data Source=(localDB)\\posinfo-tests;Initial Catalog=EntityFrameworkSqlServerExtensionsTest;Integrated Security=True");
58+
59+
var tables = await database.GetTablesAsync();
60+
61+
tables.Should().HaveCount(1);
62+
63+
tables[0].Name.Should().Be("Entity");
64+
65+
tables[0].Columns.Should().HaveCount(2);
66+
tables[0].Columns[0].Name.Should().Be("Id");
67+
tables[0].Columns[1].Name.Should().Be("Name");
68+
}
69+
70+
[Fact]
71+
public async Task CreateAsync_WithNoExistingDatabase()
72+
{
73+
var optionsBuilder = new DbContextOptionsBuilder<DbContextTest>()
74+
.UseSqlServer("Data Source=OtherServer;");
75+
76+
using var dbContext = new DbContextTest(optionsBuilder.Options);
77+
78+
var server = new SqlServer(ConnectionString);
79+
await server.DeleteDatabaseAsync(nameof(EntityFrameworkSqlServerExtensionsTest));
80+
81+
var database = await server.CreateDatabaseAsync(nameof(EntityFrameworkSqlServerExtensionsTest), dbContext);
82+
83+
database.ConnectionString.Should().Be("Data Source=(localDB)\\posinfo-tests;Initial Catalog=EntityFrameworkSqlServerExtensionsTest;Integrated Security=True");
84+
85+
var tables = await database.GetTablesAsync();
86+
87+
tables.Should().HaveCount(1);
88+
89+
tables[0].Name.Should().Be("Entity");
90+
91+
tables[0].Columns.Should().HaveCount(2);
92+
tables[0].Columns[0].Name.Should().Be("Id");
93+
tables[0].Columns[1].Name.Should().Be("Name");
94+
}
95+
96+
[Fact]
97+
public async Task CreateAsync_WithAlreadyExistingDatabase()
98+
{
99+
var optionsBuilder = new DbContextOptionsBuilder<DbContextTest>()
100+
.UseSqlServer("Data Source=OtherServer;");
101+
102+
using var dbContext = new DbContextTest(optionsBuilder.Options);
103+
104+
var server = new SqlServer(ConnectionString);
105+
var emptyDatabase = await server.CreateEmptyDatabaseAsync(nameof(EntityFrameworkSqlServerExtensionsTest));
106+
107+
await emptyDatabase.ExecuteNonQueryAsync("CREATE TABLE [MustBeDeleted] ([Id] INT)");
108+
55109
var database = await server.CreateDatabaseAsync(nameof(EntityFrameworkSqlServerExtensionsTest), dbContext);
56110

57111
database.ConnectionString.Should().Be("Data Source=(localDB)\\posinfo-tests;Initial Catalog=EntityFrameworkSqlServerExtensionsTest;Integrated Security=True");

0 commit comments

Comments
 (0)