Skip to content

Commit 7c1ad4d

Browse files
committed
Stop validating non-null/empty connection strings
Instead, let ADO.NET validate. This allows the connection string to be set as late as possible, for example in the ConnectionOpening interceptor. Fixes #23085
1 parent 1b9becc commit 7c1ad4d

File tree

8 files changed

+14
-52
lines changed

8 files changed

+14
-52
lines changed

src/EFCore.Relational/Properties/RelationalStrings.Designer.cs

Lines changed: 0 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/EFCore.Relational/Properties/RelationalStrings.resx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -719,9 +719,6 @@
719719
<data name="NoActiveTransaction" xml:space="preserve">
720720
<value>The connection does not have any active transactions.</value>
721721
</data>
722-
<data name="NoConnectionOrConnectionString" xml:space="preserve">
723-
<value>A relational store has been configured without specifying either the DbConnection or connection string to use.</value>
724-
</data>
725722
<data name="NoDbCommand" xml:space="preserve">
726723
<value>Cannot create a DbCommand for a non-relational query.</value>
727724
</data>
@@ -887,4 +884,4 @@
887884
<data name="VisitChildrenMustBeOverridden" xml:space="preserve">
888885
<value>'VisitChildren' must be overridden in the class deriving from 'SqlExpression'.</value>
889886
</data>
890-
</root>
887+
</root>

src/EFCore.Relational/Storage/RelationalConnection.cs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,7 @@ public virtual string? ConnectionString
125125
/// <returns>The connection string.</returns>
126126
/// <exception cref="InvalidOperationException">when connection string cannot be obtained.</exception>
127127
protected virtual string GetValidatedConnectionString()
128-
{
129-
var connectionString = ConnectionString;
130-
if (connectionString == null)
131-
{
132-
throw new InvalidOperationException(RelationalStrings.NoConnectionOrConnectionString);
133-
}
134-
135-
return connectionString;
136-
}
128+
=> ConnectionString!;
137129

138130
/// <summary>
139131
/// Gets or sets the underlying <see cref="System.Data.Common.DbConnection" /> used to connect to the database.
@@ -149,16 +141,7 @@ protected virtual string GetValidatedConnectionString()
149141
[AllowNull]
150142
public virtual DbConnection DbConnection
151143
{
152-
get
153-
{
154-
if (_connection == null
155-
&& _connectionString == null)
156-
{
157-
throw new InvalidOperationException(RelationalStrings.NoConnectionOrConnectionString);
158-
}
159-
160-
return _connection ??= CreateDbConnection();
161-
}
144+
get => _connection ??= CreateDbConnection();
162145
set
163146
{
164147
if (!ReferenceEquals(_connection, value))

test/EFCore.Relational.Specification.Tests/TwoDatabasesTestBase.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,10 @@ public virtual void Can_query_from_one_connection_and_save_changes_to_another()
7373
Assert.Equal(new[] { "Modified One", "Modified Two" }, context2.Foos.Select(e => e.Bar).ToList());
7474
}
7575

76-
[ConditionalFact]
77-
public virtual void Can_set_connection_string_in_interceptor()
76+
[ConditionalTheory]
77+
[InlineData(false)]
78+
[InlineData(true)]
79+
public virtual void Can_set_connection_string_in_interceptor(bool withConnectionString)
7880
{
7981
using var context1 = CreateBackingContext("TwoDatabasesIntercept");
8082

@@ -83,10 +85,10 @@ public virtual void Can_set_connection_string_in_interceptor()
8385
context1.Database.EnsureCreatedResiliently();
8486

8587
using (var context = new TwoDatabasesContext(
86-
CreateTestOptions(new DbContextOptionsBuilder(), withConnectionString: true)
88+
CreateTestOptions(new DbContextOptionsBuilder(), withConnectionString)
8789
.AddInterceptors(
8890
new ConnectionStringConnectionInterceptor(
89-
connectionString1, DummyConnectionString))
91+
connectionString1, withConnectionString ? DummyConnectionString : ""))
9092
.Options))
9193
{
9294
var data = context.Foos.ToList();

test/EFCore.Relational.Tests/RelationalConnectionTest.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -911,19 +911,6 @@ public override void PopulateDebugInfo(IDictionary<string, string> debugInfo)
911911
}
912912
}
913913

914-
[ConditionalFact]
915-
public void Throws_if_no_connection_or_connection_string_is_specified_only_when_accessed()
916-
{
917-
var connection = new FakeRelationalConnection(CreateOptions(new FakeRelationalOptionsExtension()));
918-
919-
Assert.Equal(
920-
RelationalStrings.NoConnectionOrConnectionString,
921-
Assert.Throws<InvalidOperationException>(
922-
() => connection.DbConnection).Message);
923-
924-
Assert.Null(connection.ConnectionString);
925-
}
926-
927914
[ConditionalFact]
928915
public void Puts_connection_string_on_connection_if_both_are_specified()
929916
{

test/EFCore.SqlServer.FunctionalTests/ConnectionSpecificationTest.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@ public void Throws_if_context_used_with_no_connection_or_connection_string()
5151
{
5252
using var context = new NoneInOnConfiguringContext();
5353

54-
Assert.Equal(
55-
RelationalStrings.NoConnectionOrConnectionString,
56-
Assert.Throws<InvalidOperationException>(
57-
() => context.Customers.Any()).Message);
54+
Assert.Throws<InvalidOperationException>(() => context.Customers.Any());
5855
}
5956
}
6057

test/EFCore.SqlServer.FunctionalTests/TwoDatabasesSqlServerTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ protected override DbContextOptionsBuilder CreateTestOptions(
2323
protected override TwoDatabasesWithDataContext CreateBackingContext(string databaseName)
2424
=> new(Fixture.CreateOptions(SqlServerTestStore.Create(databaseName)));
2525

26-
protected override string DummyConnectionString { get; } = "Database=DoesNotExist";
26+
protected override string DummyConnectionString
27+
=> "Database=DoesNotExist";
2728
}

test/EFCore.Sqlite.FunctionalTests/TwoDatabasesSqliteTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ protected override DbContextOptionsBuilder CreateTestOptions(
2323
protected override TwoDatabasesWithDataContext CreateBackingContext(string databaseName)
2424
=> new(Fixture.CreateOptions(SqliteTestStore.Create(databaseName)));
2525

26-
protected override string DummyConnectionString { get; } = "DataSource=DummyDatabase";
26+
protected override string DummyConnectionString
27+
=> "DataSource=DummyDatabase";
2728

2829
public class TwoDatabasesFixture : ServiceProviderFixtureBase
2930
{

0 commit comments

Comments
 (0)