diff --git a/test/Directory.Packages.props b/test/Directory.Packages.props
index 2dcd2f6da76..81ec9b34c8d 100644
--- a/test/Directory.Packages.props
+++ b/test/Directory.Packages.props
@@ -18,5 +18,6 @@
+
diff --git a/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj b/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj
index ed3086b264d..ace9f5c6456 100644
--- a/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj
+++ b/test/EFCore.AspNet.SqlServer.FunctionalTests/EFCore.AspNet.SqlServer.FunctionalTests.csproj
@@ -4,7 +4,6 @@
$(DefaultNetCoreTargetFramework)
Microsoft.EntityFrameworkCore.AspNet.SqlServer.FunctionalTests
Microsoft.EntityFrameworkCore
- True
true
$(DefineConstants);EXCLUDE_ON_MAC
diff --git a/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj b/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj
index 1778dd946d9..93cc4314ba8 100644
--- a/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj
+++ b/test/EFCore.OData.FunctionalTests/EFCore.OData.FunctionalTests.csproj
@@ -5,7 +5,6 @@
Microsoft.EntityFrameworkCore.OData.FunctionalTests
Microsoft.EntityFrameworkCore
disable
- True
true
diff --git a/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj b/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj
index d91e7e88ddf..2c818963e2c 100644
--- a/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj
+++ b/test/EFCore.SqlServer.FunctionalTests/EFCore.SqlServer.FunctionalTests.csproj
@@ -5,7 +5,6 @@
Microsoft.EntityFrameworkCore.SqlServer.FunctionalTests
Microsoft.EntityFrameworkCore
true
- True
true
@@ -77,5 +76,6 @@
+
diff --git a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs
index d0d5fa5df76..c670d70ddf4 100644
--- a/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs
+++ b/test/EFCore.SqlServer.FunctionalTests/TestUtilities/TestEnvironment.cs
@@ -3,6 +3,7 @@
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
+using Testcontainers.MsSql;
namespace Microsoft.EntityFrameworkCore.TestUtilities;
@@ -16,8 +17,46 @@ public static class TestEnvironment
.Build()
.GetSection("Test:SqlServer");
- public static string DefaultConnection { get; } = Config["DefaultConnection"]
- ?? "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0";
+ private static readonly Lazy _defaultConnection = new(InitializeConnectionString);
+
+ public static string DefaultConnection => _defaultConnection.Value;
+
+ private static MsSqlContainer? _container;
+
+ private static string InitializeConnectionString()
+ {
+ // If a connection string is specified (env var, config.json...), always use that.
+ var configured = Config["DefaultConnection"];
+ if (!string.IsNullOrEmpty(configured))
+ {
+ return configured;
+ }
+
+ // Otherwise, on Windows default to LocalDB, and on non-Windows spin up a testcontainer
+ if (OperatingSystem.IsWindows())
+ {
+ return "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0";
+ }
+
+ _container = new MsSqlBuilder("mcr.microsoft.com/mssql/server:2025-latest")
+ .Build();
+
+ _container.StartAsync().GetAwaiter().GetResult();
+
+ AppDomain.CurrentDomain.ProcessExit += (_, _) =>
+ {
+ try
+ {
+ _container.DisposeAsync().AsTask().GetAwaiter().GetResult();
+ }
+ catch
+ {
+ // Ignore errors during container cleanup
+ }
+ };
+
+ return _container.GetConnectionString();
+ }
private static readonly string _dataSource = new SqlConnectionStringBuilder(DefaultConnection).DataSource;
diff --git a/test/EFCore.SqlServer.FunctionalTests/config.json b/test/EFCore.SqlServer.FunctionalTests/config.json
index f4880f2152f..23c46fc5b59 100644
--- a/test/EFCore.SqlServer.FunctionalTests/config.json
+++ b/test/EFCore.SqlServer.FunctionalTests/config.json
@@ -1,7 +1,7 @@
{
"Test": {
"SqlServer": {
- "DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Database=master;Integrated Security=True;Connect Timeout=60;ConnectRetryCount=0",
+ "DefaultConnection": null,
"ElasticPoolName": "",
"SupportsMemoryOptimized": null
}
diff --git a/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj b/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj
index 8b60caddb2d..37c03897bbe 100644
--- a/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj
+++ b/test/EFCore.SqlServer.HierarchyId.Tests/EFCore.SqlServer.HierarchyId.Tests.csproj
@@ -5,7 +5,6 @@
Microsoft.EntityFrameworkCore.SqlServer.HierarchyId.Tests
Microsoft.EntityFrameworkCore.SqlServer
disable
- True
true
diff --git a/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj b/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj
index 6b860b8698c..2d7241547ea 100644
--- a/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj
+++ b/test/EFCore.VisualBasic.FunctionalTests/EFCore.VisualBasic.FunctionalTests.vbproj
@@ -4,7 +4,6 @@
Microsoft.EntityFrameworkCore
$(DefaultNetCoreTargetFramework)
Microsoft.EntityFrameworkCore.VisualBasic.FunctionalTests
- True
latest