diff --git a/src/EFCore.Design/Scaffolding/IModelCodeGenerator.cs b/src/EFCore.Design/Scaffolding/IModelCodeGenerator.cs index 0f9abec94f8..d518e19dcef 100644 --- a/src/EFCore.Design/Scaffolding/IModelCodeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/IModelCodeGenerator.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Design/Scaffolding/IModelCodeGeneratorSelector.cs b/src/EFCore.Design/Scaffolding/IModelCodeGeneratorSelector.cs index f81edc330e3..46de04887fe 100644 --- a/src/EFCore.Design/Scaffolding/IModelCodeGeneratorSelector.cs +++ b/src/EFCore.Design/Scaffolding/IModelCodeGeneratorSelector.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -17,6 +15,6 @@ public interface IModelCodeGeneratorSelector /// /// The programming language. /// The . - IModelCodeGenerator Select([CanBeNull] string? language); + IModelCodeGenerator Select([CanBeNull] string language); } } diff --git a/src/EFCore.Design/Scaffolding/IReverseEngineerScaffolder.cs b/src/EFCore.Design/Scaffolding/IReverseEngineerScaffolder.cs index 38aa4616713..6ddccb99c6b 100644 --- a/src/EFCore.Design/Scaffolding/IReverseEngineerScaffolder.cs +++ b/src/EFCore.Design/Scaffolding/IReverseEngineerScaffolder.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -35,7 +33,7 @@ ScaffoldedModel ScaffoldModel( /// The model files. SavedModelFiles Save( [NotNull] ScaffoldedModel scaffoldedModel, - [NotNull] string outputDir, + [CanBeNull] string outputDir, bool overwriteFiles); } } diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpDbContextGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpDbContextGenerator.cs index 406e2ae7059..924c5e76d08 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpDbContextGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpDbContextGenerator.cs @@ -15,8 +15,6 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -33,7 +31,7 @@ public class CSharpDbContextGenerator : ICSharpDbContextGenerator private readonly ICSharpHelper _code; private readonly IProviderConfigurationCodeGenerator _providerConfigurationCodeGenerator; private readonly IAnnotationCodeGenerator _annotationCodeGenerator; - private IndentedStringBuilder _sb = null!; + private IndentedStringBuilder _sb; private bool _entityTypeBuilderInitialized; /// @@ -66,7 +64,7 @@ public virtual string WriteCode( IModel model, string contextName, string connectionString, - string? contextNamespace, + string contextNamespace, string modelNamespace, bool useDataAnnotations, bool suppressConnectionStringWarning) diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs index 85cc555c21b..01a3c02d0f8 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpEntityTypeGenerator.cs @@ -14,8 +14,6 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -28,7 +26,7 @@ public class CSharpEntityTypeGenerator : ICSharpEntityTypeGenerator { private readonly ICSharpHelper _code; - private IndentedStringBuilder _sb = null!; + private IndentedStringBuilder _sb; private bool _useDataAnnotations; /// diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpModelGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpModelGenerator.cs index e5035711312..7b3c038789b 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpModelGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpModelGenerator.cs @@ -1,14 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -77,20 +74,7 @@ public override ScaffoldedModel GenerateModel( Check.NotNull(model, nameof(model)); Check.NotNull(options, nameof(options)); - if (options.ContextName == null) - { - throw new ArgumentException($"{nameof(options.ContextName)} cannot be null", nameof(options)); - } - - if (options.ConnectionString == null) - { - throw new ArgumentException($"{nameof(options.ConnectionString)} cannot be null", nameof(options)); - } - - if (options.ModelNamespace == null) - { - throw new ArgumentException($"{nameof(options.ModelNamespace)} cannot be null", nameof(options)); - } + var resultingFiles = new ScaffoldedModel(); var generatedCode = CSharpDbContextGenerator.WriteCode( model, @@ -103,12 +87,13 @@ public override ScaffoldedModel GenerateModel( // output DbContext .cs file var dbContextFileName = options.ContextName + FileExtension; - var resultingFiles = new ScaffoldedModel( - new ScaffoldedFile( - options.ContextDir != null - ? Path.Combine(options.ContextDir, dbContextFileName) - : dbContextFileName, - generatedCode)); + resultingFiles.ContextFile = new ScaffoldedFile + { + Path = options.ContextDir != null + ? Path.Combine(options.ContextDir, dbContextFileName) + : dbContextFileName, + Code = generatedCode + }; foreach (var entityType in model.GetEntityTypes()) { @@ -117,7 +102,7 @@ public override ScaffoldedModel GenerateModel( // output EntityType poco .cs file var entityTypeFileName = entityType.DisplayName() + FileExtension; resultingFiles.AdditionalFiles.Add( - new ScaffoldedFile(entityTypeFileName, generatedCode)); + new ScaffoldedFile { Path = entityTypeFileName, Code = generatedCode }); } return resultingFiles; diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpNamer.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpNamer.cs index e652888e230..c1360dac86d 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpNamer.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpNamer.cs @@ -6,8 +6,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -20,7 +18,7 @@ public class CSharpNamer { private readonly Func _nameGetter; private readonly ICSharpUtilities _cSharpUtilities; - private readonly Func? _singularizePluralizer; + private readonly Func _singularizePluralizer; /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -39,7 +37,7 @@ public class CSharpNamer public CSharpNamer( [NotNull] Func nameGetter, [NotNull] ICSharpUtilities cSharpUtilities, - [CanBeNull] Func? singularizePluralizer) + [CanBeNull] Func singularizePluralizer) { Check.NotNull(nameGetter, nameof(nameGetter)); Check.NotNull(cSharpUtilities, nameof(cSharpUtilities)); diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpUniqueNamer.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpUniqueNamer.cs index 7e832373135..b05c7a2d1d0 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpUniqueNamer.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpUniqueNamer.cs @@ -5,8 +5,6 @@ using System.Collections.Generic; using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -28,7 +26,7 @@ public class CSharpUniqueNamer : CSharpNamer public CSharpUniqueNamer( [NotNull] Func nameGetter, [NotNull] ICSharpUtilities cSharpUtilities, - [CanBeNull] Func? singularizePluralizer) + [CanBeNull] Func singularizePluralizer) : this(nameGetter, null, cSharpUtilities, singularizePluralizer) { } @@ -41,9 +39,9 @@ public CSharpUniqueNamer( /// public CSharpUniqueNamer( [NotNull] Func nameGetter, - [CanBeNull] IEnumerable? usedNames, + [CanBeNull] IEnumerable usedNames, [NotNull] ICSharpUtilities cSharpUtilities, - [CanBeNull] Func? singularizePluralizer) + [CanBeNull] Func singularizePluralizer) : base(nameGetter, cSharpUtilities, singularizePluralizer) { if (usedNames != null) diff --git a/src/EFCore.Design/Scaffolding/Internal/CSharpUtilities.cs b/src/EFCore.Design/Scaffolding/Internal/CSharpUtilities.cs index f0c9f329f5c..637039bce31 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CSharpUtilities.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CSharpUtilities.cs @@ -8,8 +8,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -124,8 +122,8 @@ public virtual bool IsCSharpKeyword(string identifier) /// public virtual string GenerateCSharpIdentifier( string identifier, - ICollection? existingIdentifiers, - Func? singularizePluralizer) + ICollection existingIdentifiers, + Func singularizePluralizer) => GenerateCSharpIdentifier(identifier, existingIdentifiers, singularizePluralizer, Uniquifier); /// @@ -136,9 +134,9 @@ public virtual string GenerateCSharpIdentifier( /// public virtual string GenerateCSharpIdentifier( string identifier, - ICollection? existingIdentifiers, - Func? singularizePluralizer, - Func?, string> uniquifier) + ICollection existingIdentifiers, + Func singularizePluralizer, + Func, string> uniquifier) { Check.NotNull(identifier, nameof(identifier)); Check.NotNull(uniquifier, nameof(uniquifier)); @@ -179,7 +177,7 @@ public virtual string GenerateCSharpIdentifier( /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public virtual string Uniquifier( - [NotNull] string proposedIdentifier, [CanBeNull] ICollection? existingIdentifiers) + [NotNull] string proposedIdentifier, [CanBeNull] ICollection existingIdentifiers) { Check.NotEmpty(proposedIdentifier, nameof(proposedIdentifier)); @@ -205,7 +203,7 @@ public virtual string Uniquifier( /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public virtual bool IsValidIdentifier(string? name) + public virtual bool IsValidIdentifier(string name) { if (string.IsNullOrEmpty(name)) { diff --git a/src/EFCore.Design/Scaffolding/Internal/CandidateNamingService.cs b/src/EFCore.Design/Scaffolding/Internal/CandidateNamingService.cs index cdbfadacc6f..e8f50874bee 100644 --- a/src/EFCore.Design/Scaffolding/Internal/CandidateNamingService.cs +++ b/src/EFCore.Design/Scaffolding/Internal/CandidateNamingService.cs @@ -9,8 +9,6 @@ using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -28,7 +26,9 @@ public class CandidateNamingService : ICandidateNamingService /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public virtual string GenerateCandidateIdentifier(DatabaseTable originalTable) - => GenerateCandidateIdentifier(originalTable.Name); + { + return GenerateCandidateIdentifier(originalTable.Name); + } /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -37,7 +37,9 @@ public virtual string GenerateCandidateIdentifier(DatabaseTable originalTable) /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public virtual string GenerateCandidateIdentifier(DatabaseColumn originalColumn) - => GenerateCandidateIdentifier(originalColumn.Name); + { + return GenerateCandidateIdentifier(originalColumn.Name); + } /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore.Design/Scaffolding/Internal/ICSharpDbContextGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/ICSharpDbContextGenerator.cs index 5504b5feabf..59378ed88d5 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ICSharpDbContextGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ICSharpDbContextGenerator.cs @@ -4,8 +4,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -26,7 +24,7 @@ string WriteCode( [NotNull] IModel model, [NotNull] string contextName, [NotNull] string connectionString, - [CanBeNull] string? contextNamespace, + [NotNull] string contextNamespace, [NotNull] string modelNamespace, bool useDataAnnotations, bool suppressConnectionStringWarning); diff --git a/src/EFCore.Design/Scaffolding/Internal/ICSharpEntityTypeGenerator.cs b/src/EFCore.Design/Scaffolding/Internal/ICSharpEntityTypeGenerator.cs index a494517220b..3bc6ea0fcd8 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ICSharpEntityTypeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ICSharpEntityTypeGenerator.cs @@ -4,8 +4,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/Internal/ICSharpUtilities.cs b/src/EFCore.Design/Scaffolding/Internal/ICSharpUtilities.cs index b2b7c7f7e05..b9c278d543a 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ICSharpUtilities.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ICSharpUtilities.cs @@ -5,8 +5,6 @@ using System.Collections.Generic; using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -24,8 +22,8 @@ public interface ICSharpUtilities /// doing so can result in application failures when updating to a new Entity Framework Core release. /// string GenerateCSharpIdentifier( - [NotNull] string identifier, [CanBeNull] ICollection? existingIdentifiers, - [CanBeNull] Func? singularizePluralizer); + [NotNull] string identifier, [CanBeNull] ICollection existingIdentifiers, + [CanBeNull] Func singularizePluralizer); /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -34,8 +32,8 @@ string GenerateCSharpIdentifier( /// doing so can result in application failures when updating to a new Entity Framework Core release. /// string GenerateCSharpIdentifier( - [NotNull] string identifier, [CanBeNull] ICollection? existingIdentifiers, - [CanBeNull] Func? singularizePluralizer, [NotNull] Func?, string> uniquifier); + [NotNull] string identifier, [CanBeNull] ICollection existingIdentifiers, + [CanBeNull] Func singularizePluralizer, [NotNull] Func, string> uniquifier); /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -51,6 +49,6 @@ string GenerateCSharpIdentifier( /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - bool IsValidIdentifier([CanBeNull] string? name); + bool IsValidIdentifier([CanBeNull] string name); } } diff --git a/src/EFCore.Design/Scaffolding/Internal/ICandidateNamingService.cs b/src/EFCore.Design/Scaffolding/Internal/ICandidateNamingService.cs index 8765255feed..6897c0f62b4 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ICandidateNamingService.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ICandidateNamingService.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/Internal/IScaffoldingModelFactory.cs b/src/EFCore.Design/Scaffolding/Internal/IScaffoldingModelFactory.cs index dd9f6e1882c..9c13e8bd54e 100644 --- a/src/EFCore.Design/Scaffolding/Internal/IScaffoldingModelFactory.cs +++ b/src/EFCore.Design/Scaffolding/Internal/IScaffoldingModelFactory.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/Internal/IScaffoldingTypeMapper.cs b/src/EFCore.Design/Scaffolding/Internal/IScaffoldingTypeMapper.cs index 9e7d10697c7..cce7a6eb0c0 100644 --- a/src/EFCore.Design/Scaffolding/Internal/IScaffoldingTypeMapper.cs +++ b/src/EFCore.Design/Scaffolding/Internal/IScaffoldingTypeMapper.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -21,6 +19,6 @@ public interface IScaffoldingTypeMapper /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - TypeScaffoldingInfo? FindMapping([NotNull] string storeType, bool keyOrIndex, bool rowVersion); + TypeScaffoldingInfo FindMapping([NotNull] string storeType, bool keyOrIndex, bool rowVersion); } } diff --git a/src/EFCore.Design/Scaffolding/Internal/ModelCodeGeneratorSelector.cs b/src/EFCore.Design/Scaffolding/Internal/ModelCodeGeneratorSelector.cs index 5bbd2fa7b21..dc01f69a7f3 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ModelCodeGeneratorSelector.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ModelCodeGeneratorSelector.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Design.Internal; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs index d85751c9799..5f43665105a 100644 --- a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs +++ b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs @@ -36,6 +36,7 @@ public class RelationalScaffoldingModelFactory : IScaffoldingModelFactory private readonly ICandidateNamingService _candidateNamingService; private Dictionary> _columnNamers; private bool _useDatabaseNames; + private readonly DatabaseTable _nullTable = new DatabaseTable(); private CSharpUniqueNamer _tableNamer; private CSharpUniqueNamer _dbSetNamer; private readonly HashSet _unmappedColumns = new HashSet(); @@ -137,8 +138,12 @@ protected virtual string GetPropertyName([NotNull] DatabaseColumn column) { Check.NotNull(column, nameof(column)); - var table = column.Table; - var usedNames = new List { GetEntityTypeName(table) }; + var table = column.Table ?? _nullTable; + var usedNames = new List(); + if (column.Table != null) + { + usedNames.Add(GetEntityTypeName(table)); + } if (!_columnNamers.ContainsKey(table)) { diff --git a/src/EFCore.Design/Scaffolding/Internal/ReverseEngineerScaffolder.cs b/src/EFCore.Design/Scaffolding/Internal/ReverseEngineerScaffolder.cs index f4f37147ef7..3aed6b2e3dd 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ReverseEngineerScaffolder.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ReverseEngineerScaffolder.cs @@ -15,8 +15,6 @@ using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -52,9 +50,7 @@ public ReverseEngineerScaffolder( Check.NotNull(databaseModelFactory, nameof(databaseModelFactory)); Check.NotNull(scaffoldingModelFactory, nameof(scaffoldingModelFactory)); Check.NotNull(modelCodeGeneratorSelector, nameof(modelCodeGeneratorSelector)); - Check.NotNull(cSharpUtilities, nameof(cSharpUtilities)); Check.NotNull(cSharpHelper, nameof(cSharpHelper)); - Check.NotNull(connectionStringResolver, nameof(connectionStringResolver)); _databaseModelFactory = databaseModelFactory; _factory = scaffoldingModelFactory; diff --git a/src/EFCore.Design/Scaffolding/Internal/ScaffoldingTypeMapper.cs b/src/EFCore.Design/Scaffolding/Internal/ScaffoldingTypeMapper.cs index 4bdc90a0c3c..ec7518babff 100644 --- a/src/EFCore.Design/Scaffolding/Internal/ScaffoldingTypeMapper.cs +++ b/src/EFCore.Design/Scaffolding/Internal/ScaffoldingTypeMapper.cs @@ -6,8 +6,6 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// @@ -39,7 +37,7 @@ public ScaffoldingTypeMapper([NotNull] IRelationalTypeMappingSource typeMappingS /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public virtual TypeScaffoldingInfo? FindMapping( + public virtual TypeScaffoldingInfo FindMapping( string storeType, bool keyOrIndex, bool rowVersion) diff --git a/src/EFCore.Design/Scaffolding/Internal/TypeScaffoldingInfo.cs b/src/EFCore.Design/Scaffolding/Internal/TypeScaffoldingInfo.cs index 6baa1219495..8decdb9a7e9 100644 --- a/src/EFCore.Design/Scaffolding/Internal/TypeScaffoldingInfo.cs +++ b/src/EFCore.Design/Scaffolding/Internal/TypeScaffoldingInfo.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseColumnExtensions.cs b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseColumnExtensions.cs index 2a3174758ba..1cf7bbe3698 100644 --- a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseColumnExtensions.cs +++ b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseColumnExtensions.cs @@ -6,8 +6,6 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata.Internal; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata.Internal { /// @@ -25,7 +23,10 @@ public static class DatabaseColumnExtensions /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public static string DisplayName([NotNull] this DatabaseColumn column) - => column.Table.DisplayName() + "." + column.Name; + { + var tablePrefix = column.Table?.DisplayName(); + return (!string.IsNullOrEmpty(tablePrefix) ? tablePrefix + "." : "") + column.Name; + } /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to diff --git a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseForeignKeyExtensions.cs b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseForeignKeyExtensions.cs index e94dda70d51..808ae435b46 100644 --- a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseForeignKeyExtensions.cs +++ b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseForeignKeyExtensions.cs @@ -4,8 +4,6 @@ using System.Linq; using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata.Internal { /// @@ -23,6 +21,6 @@ public static class DatabaseForeignKeyExtensions /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public static string DisplayName([NotNull] this DatabaseForeignKey foreignKey) - => foreignKey.Table.DisplayName() + "(" + string.Join(",", foreignKey.Columns.Select(f => f.Name)) + ")"; + => foreignKey.Table?.DisplayName() + "(" + string.Join(",", foreignKey.Columns.Select(f => f.Name)) + ")"; } } diff --git a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseTableExtensions.cs b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseTableExtensions.cs index f81a2911507..048cef1f1b0 100644 --- a/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseTableExtensions.cs +++ b/src/EFCore.Design/Scaffolding/Metadata/Internal/DatabaseTableExtensions.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata.Internal { /// diff --git a/src/EFCore.Design/Scaffolding/ModelCodeGenerationOptions.cs b/src/EFCore.Design/Scaffolding/ModelCodeGenerationOptions.cs index 0b2320efc05..0472df26887 100644 --- a/src/EFCore.Design/Scaffolding/ModelCodeGenerationOptions.cs +++ b/src/EFCore.Design/Scaffolding/ModelCodeGenerationOptions.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -28,42 +26,42 @@ public class ModelCodeGenerationOptions /// Gets or sets the namespace of the project. /// /// The namespace of the project. - public virtual string? RootNamespace { get; [param: CanBeNull] set; } + public virtual string RootNamespace { get; [param: CanBeNull] set; } /// /// Gets or sets the namespace for model classes. /// /// The namespace for model classes. - public virtual string? ModelNamespace { get; [param: CanBeNull] set; } + public virtual string ModelNamespace { get; [param: CanBeNull] set; } /// /// Gets or sets the namespace for context class. /// /// The namespace for context class. - public virtual string? ContextNamespace { get; [param: CanBeNull] set; } + public virtual string ContextNamespace { get; [param: CanBeNull] set; } /// /// Gets or sets the programming language to scaffold for. /// /// The programming language to scaffold for. - public virtual string? Language { get; [param: CanBeNull] set; } + public virtual string Language { get; [param: CanBeNull] set; } /// /// Gets or sets the DbContext output directory. /// /// The DbContext output directory. - public virtual string? ContextDir { get; [param: CanBeNull] set; } + public virtual string ContextDir { get; [param: CanBeNull] set; } /// /// Gets or sets the name. /// /// The name. - public virtual string? ContextName { get; [param: CanBeNull] set; } + public virtual string ContextName { get; [param: CanBeNull] set; } /// /// Gets or sets the connection string. /// /// The connection string. - public virtual string? ConnectionString { get; [param: CanBeNull] set; } + public virtual string ConnectionString { get; [param: CanBeNull] set; } } } diff --git a/src/EFCore.Design/Scaffolding/ModelCodeGenerator.cs b/src/EFCore.Design/Scaffolding/ModelCodeGenerator.cs index 6cd483c0009..bcb5100c1e2 100644 --- a/src/EFCore.Design/Scaffolding/ModelCodeGenerator.cs +++ b/src/EFCore.Design/Scaffolding/ModelCodeGenerator.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Design/Scaffolding/ModelCodeGeneratorDependencies.cs b/src/EFCore.Design/Scaffolding/ModelCodeGeneratorDependencies.cs index 9e0a8301fb7..fd082781cc9 100644 --- a/src/EFCore.Design/Scaffolding/ModelCodeGeneratorDependencies.cs +++ b/src/EFCore.Design/Scaffolding/ModelCodeGeneratorDependencies.cs @@ -3,8 +3,6 @@ using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Design/Scaffolding/ModelReverseEngineerOptions.cs b/src/EFCore.Design/Scaffolding/ModelReverseEngineerOptions.cs index ff1e629b476..5d15c60383b 100644 --- a/src/EFCore.Design/Scaffolding/ModelReverseEngineerOptions.cs +++ b/src/EFCore.Design/Scaffolding/ModelReverseEngineerOptions.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Design/Scaffolding/SavedModelFiles.cs b/src/EFCore.Design/Scaffolding/SavedModelFiles.cs index 9d819a6af75..111e08a937a 100644 --- a/src/EFCore.Design/Scaffolding/SavedModelFiles.cs +++ b/src/EFCore.Design/Scaffolding/SavedModelFiles.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Design/Scaffolding/ScaffoldedFile.cs b/src/EFCore.Design/Scaffolding/ScaffoldedFile.cs index 74f075faffb..0de071738a2 100644 --- a/src/EFCore.Design/Scaffolding/ScaffoldedFile.cs +++ b/src/EFCore.Design/Scaffolding/ScaffoldedFile.cs @@ -3,8 +3,6 @@ using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -12,12 +10,6 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding /// public class ScaffoldedFile { - public ScaffoldedFile([NotNull] string path, [NotNull] string code) - { - Path = path; - Code = code; - } - /// /// Gets or sets the path. /// diff --git a/src/EFCore.Design/Scaffolding/ScaffoldedModel.cs b/src/EFCore.Design/Scaffolding/ScaffoldedModel.cs index 7c55b54254e..d8041c17e43 100644 --- a/src/EFCore.Design/Scaffolding/ScaffoldedModel.cs +++ b/src/EFCore.Design/Scaffolding/ScaffoldedModel.cs @@ -4,8 +4,6 @@ using System.Collections.Generic; using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -13,11 +11,6 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding /// public class ScaffoldedModel { - public ScaffoldedModel([NotNull] ScaffoldedFile contextFile) - { - ContextFile = contextFile; - } - /// /// Gets or sets the generated file containing the . /// diff --git a/src/EFCore.Relational/Scaffolding/DatabaseModelFactory.cs b/src/EFCore.Relational/Scaffolding/DatabaseModelFactory.cs index 711069444ee..5eddcdd829f 100644 --- a/src/EFCore.Relational/Scaffolding/DatabaseModelFactory.cs +++ b/src/EFCore.Relational/Scaffolding/DatabaseModelFactory.cs @@ -4,8 +4,6 @@ using System.Data.Common; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Relational/Scaffolding/DatabaseModelFactoryOptions.cs b/src/EFCore.Relational/Scaffolding/DatabaseModelFactoryOptions.cs index f070ce0df46..cd6ccd990bb 100644 --- a/src/EFCore.Relational/Scaffolding/DatabaseModelFactoryOptions.cs +++ b/src/EFCore.Relational/Scaffolding/DatabaseModelFactoryOptions.cs @@ -5,8 +5,6 @@ using System.Linq; using JetBrains.Annotations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -19,7 +17,7 @@ public class DatabaseModelFactoryOptions /// /// A list of tables to include. Empty to include all tables. /// A list of schemas to include. Empty to include all schemas. - public DatabaseModelFactoryOptions([CanBeNull] IEnumerable? tables = null, [CanBeNull] IEnumerable? schemas = null) + public DatabaseModelFactoryOptions([CanBeNull] IEnumerable tables = null, [CanBeNull] IEnumerable schemas = null) { Tables = tables ?? Enumerable.Empty(); Schemas = schemas ?? Enumerable.Empty(); diff --git a/src/EFCore.Relational/Scaffolding/IDatabaseModelFactory.cs b/src/EFCore.Relational/Scaffolding/IDatabaseModelFactory.cs index 0b0163b9273..0113420c000 100644 --- a/src/EFCore.Relational/Scaffolding/IDatabaseModelFactory.cs +++ b/src/EFCore.Relational/Scaffolding/IDatabaseModelFactory.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Relational/Scaffolding/IProviderCodeGeneratorPlugin.cs b/src/EFCore.Relational/Scaffolding/IProviderCodeGeneratorPlugin.cs index 3ae09504f4b..d203069dad2 100644 --- a/src/EFCore.Relational/Scaffolding/IProviderCodeGeneratorPlugin.cs +++ b/src/EFCore.Relational/Scaffolding/IProviderCodeGeneratorPlugin.cs @@ -3,8 +3,6 @@ using Microsoft.EntityFrameworkCore.Design; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -16,12 +14,12 @@ public interface IProviderCodeGeneratorPlugin /// Generates a method chain used to configure provider-specific options. /// /// The method chain. May be null. - MethodCallCodeFragment? GenerateProviderOptions(); + MethodCallCodeFragment GenerateProviderOptions(); /// /// Generates a method chain to configure additional context options. /// /// The method chain. May be null. - MethodCallCodeFragment? GenerateContextOptions(); + MethodCallCodeFragment GenerateContextOptions(); } } diff --git a/src/EFCore.Relational/Scaffolding/IProviderConfigurationCodeGenerator.cs b/src/EFCore.Relational/Scaffolding/IProviderConfigurationCodeGenerator.cs index d07e83cf0a0..a64fd02ff88 100644 --- a/src/EFCore.Relational/Scaffolding/IProviderConfigurationCodeGenerator.cs +++ b/src/EFCore.Relational/Scaffolding/IProviderConfigurationCodeGenerator.cs @@ -4,8 +4,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Design; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -18,7 +16,7 @@ public interface IProviderConfigurationCodeGenerator /// Generates a method chain used to configure provider-specific options. /// /// The method chain. May be null. - MethodCallCodeFragment? GenerateProviderOptions(); + MethodCallCodeFragment GenerateProviderOptions(); /// /// Generates a code fragment like .UseSqlServer("Database=Foo") which can be used in @@ -29,12 +27,12 @@ public interface IProviderConfigurationCodeGenerator /// The code fragment. MethodCallCodeFragment GenerateUseProvider( [NotNull] string connectionString, - [CanBeNull] MethodCallCodeFragment? providerOptions); + [CanBeNull] MethodCallCodeFragment providerOptions); /// /// Generates a method chain to configure additional context options. /// /// The method chain. May be null. - MethodCallCodeFragment? GenerateContextOptions(); + MethodCallCodeFragment GenerateContextOptions(); } } diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseColumn.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseColumn.cs index a463e9df03b..0620eb872a7 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseColumn.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseColumn.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -14,13 +12,6 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseColumn : Annotatable { - public DatabaseColumn([NotNull] DatabaseTable table, [NotNull] string name, [NotNull] string storeType) - { - Table = table; - Name = name; - StoreType = storeType; - } - /// /// The table that contains this column. /// @@ -39,22 +30,22 @@ public DatabaseColumn([NotNull] DatabaseTable table, [NotNull] string name, [Not /// /// The database/store type of the column. /// - public virtual string StoreType { get; [param: NotNull] set; } + public virtual string StoreType { get; [param: CanBeNull] set; } /// /// The default constraint for the column, or null if none. /// - public virtual string? DefaultValueSql { get; [param: CanBeNull] set; } + public virtual string DefaultValueSql { get; [param: CanBeNull] set; } /// /// The SQL expression that computes the value of the column, or null if this is not a computed column. /// - public virtual string? ComputedColumnSql { get; [param: CanBeNull] set; } + public virtual string ComputedColumnSql { get; [param: CanBeNull] set; } /// /// The column comment, or null if none is set. /// - public virtual string? Comment { get; [param: CanBeNull] set; } + public virtual string Comment { get; [param: CanBeNull] set; } /// /// Indicates when values will be generated by the database for this column, or null if diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseForeignKey.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseForeignKey.cs index b749ce1f7e9..d719d3e7097 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseForeignKey.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseForeignKey.cs @@ -6,8 +6,6 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -15,43 +13,31 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseForeignKey : Annotatable { - public DatabaseForeignKey( - [NotNull] DatabaseTable table, - [NotNull] string name, - [NotNull] DatabaseTable principalTable) - { - Table = table; - Name = name; - PrincipalTable = principalTable; - Columns = new List(); - PrincipalColumns = new List(); - } - /// /// The table that contains the foreign key constraint. /// - public virtual DatabaseTable Table { get; [param: NotNull] set; } + public virtual DatabaseTable Table { get; [param: CanBeNull] set; } /// /// The table to which the columns are constrained. /// - public virtual DatabaseTable PrincipalTable { get; [param: NotNull] set; } + public virtual DatabaseTable PrincipalTable { get; [param: CanBeNull] set; } /// /// The ordered list of columns that are constrained. /// - public virtual IList Columns { get; } + public virtual IList Columns { get; } = new List(); /// /// The ordered list of columns in the to which the /// of the foreign key are constrained. /// - public virtual IList PrincipalColumns { get; } + public virtual IList PrincipalColumns { get; } = new List(); /// /// The foreign key constraint name. /// - public virtual string Name { get; [param: NotNull] set; } + public virtual string Name { get; [param: CanBeNull] set; } /// /// The action performed by the database when a row constrained by this foreign key diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseIndex.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseIndex.cs index d1c2ef278a4..60e110e5271 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseIndex.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseIndex.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -14,17 +12,10 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseIndex : Annotatable { - public DatabaseIndex([NotNull] DatabaseTable table, [NotNull] string name) - { - Table = table; - Name = name; - Columns = new List(); - } - /// /// The table that contains the index. /// - public virtual DatabaseTable Table { get; [param: NotNull] set; } + public virtual DatabaseTable Table { get; [param: CanBeNull] set; } /// /// The index name. @@ -34,7 +25,7 @@ public DatabaseIndex([NotNull] DatabaseTable table, [NotNull] string name) /// /// The ordered list of columns that make up the index. /// - public virtual IList Columns { get; } + public virtual IList Columns { get; } = new List(); /// /// Indicates whether or not the index constrains uniqueness. @@ -44,6 +35,6 @@ public DatabaseIndex([NotNull] DatabaseTable table, [NotNull] string name) /// /// The filter expression, or null if the index has no filter. /// - public virtual string? Filter { get; [param: CanBeNull] set; } + public virtual string Filter { get; [param: CanBeNull] set; } } } diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseModel.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseModel.cs index c2ad8f2e9e4..55acbbe0d26 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseModel.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseModel.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -17,12 +15,12 @@ public class DatabaseModel : Annotatable /// /// The database name, or null if none is set. /// - public virtual string? DatabaseName { get; [param: CanBeNull] set; } + public virtual string DatabaseName { get; [param: CanBeNull] set; } /// /// The database schema, or null to use the default schema. /// - public virtual string? DefaultSchema { get; [param: CanBeNull] set; } + public virtual string DefaultSchema { get; [param: CanBeNull] set; } /// /// The list of tables in the database. diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabasePrimaryKey.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabasePrimaryKey.cs index 175840bb830..4e7eca6bd12 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabasePrimaryKey.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabasePrimaryKey.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -14,17 +12,10 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabasePrimaryKey : Annotatable { - public DatabasePrimaryKey([NotNull] DatabaseTable table, [NotNull] string name) - { - Table = table; - Name = name; - Columns = new List(); - } - /// /// The table on which the primary key is defined. /// - public virtual DatabaseTable Table { get; [param: NotNull] set; } + public virtual DatabaseTable Table { get; [param: CanBeNull] set; } /// /// The name of the primary key. @@ -34,6 +25,6 @@ public DatabasePrimaryKey([NotNull] DatabaseTable table, [NotNull] string name) /// /// The ordered list of columns that make up the primary key. /// - public virtual IList Columns { get; } + public virtual IList Columns { get; } = new List(); } } diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseSequence.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseSequence.cs index f1bd6b2ff25..1422ffa82d0 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseSequence.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseSequence.cs @@ -4,8 +4,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -13,12 +11,6 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseSequence : Annotatable { - public DatabaseSequence([NotNull] DatabaseModel database, [NotNull] string name) - { - Database = database; - Name = name; - } - /// /// The database that contains the sequence. /// @@ -32,12 +24,12 @@ public DatabaseSequence([NotNull] DatabaseModel database, [NotNull] string name) /// /// The schema that contains the sequence, or null to use the default schema. /// - public virtual string? Schema { get; [param: CanBeNull] set; } + public virtual string Schema { get; [param: CanBeNull] set; } /// /// The database/store type of the sequence, or null if not set. /// - public virtual string? StoreType { get; [param: CanBeNull] set; } + public virtual string StoreType { get; [param: CanBeNull] set; } /// /// The start value for the sequence, or null if not set. diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseTable.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseTable.cs index c85a2098122..2b6ac004ac3 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseTable.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseTable.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -14,16 +12,6 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseTable : Annotatable { - public DatabaseTable([NotNull] DatabaseModel database, [NotNull] string name) - { - Database = database; - Name = name; - Columns = new List(); - UniqueConstraints = new List(); - Indexes = new List(); - ForeignKeys = new List(); - } - /// /// The database that contains the table. /// @@ -37,36 +25,36 @@ public DatabaseTable([NotNull] DatabaseModel database, [NotNull] string name) /// /// The table schema, or null to use the default schema. /// - public virtual string? Schema { get; [param: CanBeNull] set; } + public virtual string Schema { get; [param: CanBeNull] set; } /// /// The table comment, or null if none is set. /// - public virtual string? Comment { get; [param: CanBeNull] set; } + public virtual string Comment { get; [param: CanBeNull] set; } /// /// The primary key of the table. /// - public virtual DatabasePrimaryKey? PrimaryKey { get; [param: CanBeNull] set; } + public virtual DatabasePrimaryKey PrimaryKey { get; [param: CanBeNull] set; } /// /// The ordered list of columns in the table. /// - public virtual IList Columns { get; } + public virtual IList Columns { get; } = new List(); /// /// The list of unique constraints defined on the table. /// - public virtual IList UniqueConstraints { get; } + public virtual IList UniqueConstraints { get; } = new List(); /// /// The list of indexes defined on the table. /// - public virtual IList Indexes { get; } + public virtual IList Indexes { get; } = new List(); /// /// The list of foreign key constraints defined on the table. /// - public virtual IList ForeignKeys { get; } + public virtual IList ForeignKeys { get; } = new List(); } } diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseUniqueConstraint.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseUniqueConstraint.cs index 6dac16ac7ec..074354b7d26 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseUniqueConstraint.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseUniqueConstraint.cs @@ -5,8 +5,6 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Infrastructure; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -14,17 +12,10 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseUniqueConstraint : Annotatable { - public DatabaseUniqueConstraint([NotNull] DatabaseTable table, [NotNull] string name) - { - Table = table; - Name = name; - Columns = new List(); - } - /// /// The table on which the unique constraint is defined. /// - public virtual DatabaseTable Table { get; [param: NotNull] set; } + public virtual DatabaseTable Table { get; [param: CanBeNull] set; } /// /// The name of the constraint. @@ -34,6 +25,6 @@ public DatabaseUniqueConstraint([NotNull] DatabaseTable table, [NotNull] string /// /// The ordered list of columns that make up the constraint. /// - public virtual IList Columns { get; } + public virtual IList Columns { get; } = new List(); } } diff --git a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseView.cs b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseView.cs index 1723bd37cf2..1f936e7ad18 100644 --- a/src/EFCore.Relational/Scaffolding/Metadata/DatabaseView.cs +++ b/src/EFCore.Relational/Scaffolding/Metadata/DatabaseView.cs @@ -1,10 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using JetBrains.Annotations; - -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata { /// @@ -12,9 +8,5 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Metadata /// public class DatabaseView : DatabaseTable { - public DatabaseView([NotNull] DatabaseModel database, [NotNull] string name) - : base(database, name) - { - } } } diff --git a/src/EFCore.Relational/Scaffolding/ProviderCodeGenerator.cs b/src/EFCore.Relational/Scaffolding/ProviderCodeGenerator.cs index fd6ee40905d..f48a8815497 100644 --- a/src/EFCore.Relational/Scaffolding/ProviderCodeGenerator.cs +++ b/src/EFCore.Relational/Scaffolding/ProviderCodeGenerator.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -30,9 +28,9 @@ protected ProviderCodeGenerator([NotNull] ProviderCodeGeneratorDependencies depe /// Generates a method chain used to configure provider-specific options. /// /// The method chain. May be null. - public virtual MethodCallCodeFragment? GenerateProviderOptions() + public virtual MethodCallCodeFragment GenerateProviderOptions() { - MethodCallCodeFragment? providerOptions = null; + MethodCallCodeFragment providerOptions = null; foreach (var plugin in Dependencies.Plugins) { @@ -57,15 +55,15 @@ protected ProviderCodeGenerator([NotNull] ProviderCodeGeneratorDependencies depe /// The code fragment. public abstract MethodCallCodeFragment GenerateUseProvider( string connectionString, - MethodCallCodeFragment? providerOptions); + MethodCallCodeFragment providerOptions); /// /// Generates a method chain to configure additional context options. /// /// The method chain. May be null. - public virtual MethodCallCodeFragment? GenerateContextOptions() + public virtual MethodCallCodeFragment GenerateContextOptions() { - MethodCallCodeFragment? contextOptions = null; + MethodCallCodeFragment contextOptions = null; foreach (var plugin in Dependencies.Plugins) { diff --git a/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorDependencies.cs b/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorDependencies.cs index 97a7e7b912e..6b5f40b1c4d 100644 --- a/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorDependencies.cs +++ b/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorDependencies.cs @@ -6,8 +6,6 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// diff --git a/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorPlugin.cs b/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorPlugin.cs index eae9aff7fca..472d9ab6174 100644 --- a/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorPlugin.cs +++ b/src/EFCore.Relational/Scaffolding/ProviderCodeGeneratorPlugin.cs @@ -3,8 +3,6 @@ using Microsoft.EntityFrameworkCore.Design; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Scaffolding { /// @@ -16,14 +14,14 @@ public class ProviderCodeGeneratorPlugin : IProviderCodeGeneratorPlugin /// Generates a method chain used to configure provider-specific options. /// /// The method chain. May be null. - public virtual MethodCallCodeFragment? GenerateContextOptions() + public virtual MethodCallCodeFragment GenerateContextOptions() => null; /// /// Generates a method chain to configure additional context options. /// /// The method chain. May be null. - public virtual MethodCallCodeFragment? GenerateProviderOptions() + public virtual MethodCallCodeFragment GenerateProviderOptions() => null; } } diff --git a/src/EFCore.SqlServer/Scaffolding/Internal/SqlDataReaderExtension.cs b/src/EFCore.SqlServer/Scaffolding/Internal/SqlDataReaderExtension.cs index d497bf8ff00..282fecd9616 100644 --- a/src/EFCore.SqlServer/Scaffolding/Internal/SqlDataReaderExtension.cs +++ b/src/EFCore.SqlServer/Scaffolding/Internal/SqlDataReaderExtension.cs @@ -2,10 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Data.Common; -using System.Diagnostics.CodeAnalysis; -using JB = JetBrains.Annotations; - -#nullable enable +using JetBrains.Annotations; namespace Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal { @@ -23,8 +20,7 @@ public static class SqlDataReaderExtension /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - [return: MaybeNull] - public static T GetValueOrDefault([JB.NotNull] this DbDataReader reader, [JB.NotNull] string name) + public static T GetValueOrDefault([NotNull] this DbDataReader reader, [NotNull] string name) { var idx = reader.GetOrdinal(name); return reader.IsDBNull(idx) @@ -38,22 +34,12 @@ public static T GetValueOrDefault([JB.NotNull] this DbDataReader reader, [JB. /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - [return: MaybeNull] - public static T GetValueOrDefault([JB.NotNull] this DbDataRecord record, [JB.NotNull] string name) + public static T GetValueOrDefault([NotNull] this DbDataRecord record, [NotNull] string name) { var idx = record.GetOrdinal(name); return record.IsDBNull(idx) ? default : (T)record.GetValue(idx); } - - /// - /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to - /// the same compatibility standards as public APIs. It may be changed or removed without notice in - /// any release. You should only use it directly in your code with extreme caution and knowing that - /// doing so can result in application failures when updating to a new Entity Framework Core release. - /// - public static T GetFieldValue([JB.NotNull] this DbDataRecord record, [JB.NotNull] string name) - => (T)record.GetValue(record.GetOrdinal(name)); } } diff --git a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerCodeGenerator.cs b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerCodeGenerator.cs index da6e9d7e4cb..044de83b72c 100644 --- a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerCodeGenerator.cs +++ b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerCodeGenerator.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Scaffolding; -#nullable enable - namespace Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal { /// @@ -34,7 +32,7 @@ public SqlServerCodeGenerator([NotNull] ProviderCodeGeneratorDependencies depend /// public override MethodCallCodeFragment GenerateUseProvider( string connectionString, - MethodCallCodeFragment? providerOptions) + MethodCallCodeFragment providerOptions) => new MethodCallCodeFragment( nameof(SqlServerDbContextOptionsExtensions.UseSqlServer), providerOptions == null diff --git a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs index c2a3ee262b5..bf0902e2fb7 100644 --- a/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs +++ b/src/EFCore.SqlServer/Scaffolding/Internal/SqlServerDatabaseModelFactory.cs @@ -20,8 +20,6 @@ using Microsoft.EntityFrameworkCore.SqlServer.Metadata.Internal; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal { /// @@ -137,10 +135,18 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto if (SupportsSequences(connection)) { - GetSequences(connection, databaseModel, schemaFilter, typeAliases); + foreach (var sequence in GetSequences(connection, schemaFilter, typeAliases)) + { + sequence.Database = databaseModel; + databaseModel.Sequences.Add(sequence); + } } - GetTables(connection, databaseModel, tableFilter, typeAliases); + foreach (var table in GetTables(connection, tableFilter, typeAliases)) + { + table.Database = databaseModel; + databaseModel.Tables.Add(table); + } foreach (var schema in schemaList .Except( @@ -173,7 +179,7 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto } } - private string? GetDefaultSchema(DbConnection connection) + private string GetDefaultSchema(DbConnection connection) { using var command = connection.CreateCommand(); command.CommandText = "SELECT SCHEMA_NAME()"; @@ -188,7 +194,7 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto return null; } - private static Func? GenerateSchemaFilter(IReadOnlyList schemas) + private static Func GenerateSchemaFilter(IReadOnlyList schemas) { return schemas.Count > 0 ? (s => @@ -200,10 +206,10 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto schemaFilterBuilder.Append(")"); return schemaFilterBuilder.ToString(); }) - : (Func?)null; + : (Func)null; } - private static (string? Schema, string Table) Parse(string table) + private static (string Schema, string Table) Parse(string table) { var match = _partExtractor.Match(table.Trim()); @@ -218,9 +224,9 @@ private static (string? Schema, string Table) Parse(string table) return string.IsNullOrEmpty(part2) ? (null, part1) : (part1, part2); } - private static Func? GenerateTableFilter( - IReadOnlyList<(string? Schema, string Table)> tables, - Func? schemaFilter) + private static Func GenerateTableFilter( + IReadOnlyList<(string Schema, string Table)> tables, + Func schemaFilter) => schemaFilter != null || tables.Count > 0 ? ((s, t) => @@ -287,7 +293,7 @@ private static (string? Schema, string Table) Parse(string table) return tableFilterBuilder.ToString(); }) - : (Func?)null; + : (Func)null; private static string EscapeLiteral(string s) => $"N'{s}'"; @@ -313,8 +319,8 @@ FROM [sys].[types] AS [t] while (reader.Read()) { var schema = reader.GetValueOrDefault("schema_name"); - var userType = reader.GetFieldValue("type_name"); - var systemType = reader.GetFieldValue("underlying_system_type"); + var userType = reader.GetValueOrDefault("type_name"); + var systemType = reader.GetValueOrDefault("underlying_system_type"); var maxLength = reader.GetValueOrDefault("max_length"); var precision = reader.GetValueOrDefault("precision"); var scale = reader.GetValueOrDefault("scale"); @@ -330,10 +336,9 @@ FROM [sys].[types] AS [t] return typeAliasMap; } - private void GetSequences( + private IEnumerable GetSequences( DbConnection connection, - DatabaseModel databaseModel, - Func? schemaFilter, + Func schemaFilter, IReadOnlyDictionary typeAliases) { using var command = connection.CreateCommand(); @@ -364,9 +369,9 @@ FROM [sys].[sequences] AS [s] while (reader.Read()) { var schema = reader.GetValueOrDefault("schema_name"); - var name = reader.GetString("name"); + var name = reader.GetValueOrDefault("name"); var storeTypeSchema = reader.GetValueOrDefault("type_schema"); - var storeType = reader.GetString("type_name"); + var storeType = reader.GetValueOrDefault("type_name"); var precision = reader.GetValueOrDefault("precision"); var scale = reader.GetValueOrDefault("scale"); var isCyclic = reader.GetValueOrDefault("is_cycling"); @@ -385,9 +390,10 @@ FROM [sys].[sequences] AS [s] _logger.SequenceFound(DisplayName(schema, name), storeType, isCyclic, incrementBy, startValue, minValue, maxValue); - var sequence = new DatabaseSequence(databaseModel, name) + var sequence = new DatabaseSequence { Schema = schema, + Name = name, StoreType = storeType, IsCyclic = isCyclic, IncrementBy = incrementBy, @@ -407,14 +413,13 @@ FROM [sys].[sequences] AS [s] : sequence.MaxValue; } - databaseModel.Sequences.Add(sequence); + yield return sequence; } } - private void GetTables( + private IEnumerable GetTables( DbConnection connection, - DatabaseModel databaseModel, - Func? tableFilter, + Func tableFilter, IReadOnlyDictionary typeAliases) { using var command = connection.CreateCommand(); @@ -510,17 +515,18 @@ FROM [sys].[views] AS [v] while (reader.Read()) { var schema = reader.GetValueOrDefault("schema"); - var name = reader.GetString("name"); + var name = reader.GetValueOrDefault("name"); var comment = reader.GetValueOrDefault("comment"); - var type = reader.GetString("type"); + var type = reader.GetValueOrDefault("type"); _logger.TableFound(DisplayName(schema, name)); var table = type == "table" - ? new DatabaseTable(databaseModel, name) - : new DatabaseView(databaseModel, name); + ? new DatabaseTable() + : new DatabaseView(); table.Schema = schema; + table.Name = name; table.Comment = comment; if (supportsMemoryOptimizedTable) @@ -540,10 +546,7 @@ FROM [sys].[views] AS [v] GetIndexes(connection, tables, filter); GetForeignKeys(connection, tables, filter); - foreach (var table in tables) - { - databaseModel.Tables.Add(table); - } + return tables; } private void GetColumns( @@ -617,10 +620,10 @@ UNION ALL foreach (var dataRecord in tableColumnGroup) { - var columnName = dataRecord.GetFieldValue("column_name"); - var ordinal = dataRecord.GetFieldValue("ordinal"); + var columnName = dataRecord.GetValueOrDefault("column_name"); + var ordinal = dataRecord.GetValueOrDefault("ordinal"); var dataTypeSchemaName = dataRecord.GetValueOrDefault("type_schema"); - var dataTypeName = dataRecord.GetFieldValue("type_name"); + var dataTypeName = dataRecord.GetValueOrDefault("type_name"); var maxLength = dataRecord.GetValueOrDefault("max_length"); var precision = dataRecord.GetValueOrDefault("precision"); var scale = dataRecord.GetValueOrDefault("scale"); @@ -660,8 +663,11 @@ UNION ALL defaultValue = FilterClrDefaults(systemTypeName, nullable, defaultValue); - var column = new DatabaseColumn(table, columnName, storeType) + var column = new DatabaseColumn { + Table = table, + Name = columnName, + StoreType = storeType, IsNullable = nullable, DefaultValueSql = defaultValue, ComputedColumnSql = computedValue, @@ -686,7 +692,7 @@ UNION ALL } } - private static string? FilterClrDefaults(string dataTypeName, bool nullable, string? defaultValue) + private static string FilterClrDefaults(string dataTypeName, bool nullable, string defaultValue) { if (defaultValue == null || defaultValue == "(NULL)") @@ -843,7 +849,7 @@ FROM [sys].[indexes] i .Where(ddr => ddr.GetValueOrDefault("is_primary_key")) .GroupBy( ddr => - (Name: ddr.GetFieldValue("index_name"), + (Name: ddr.GetValueOrDefault("index_name"), TypeDesc: ddr.GetValueOrDefault("type_desc"))) .ToArray(); @@ -853,7 +859,7 @@ FROM [sys].[indexes] i _logger.PrimaryKeyFound(primaryKeyGroup.Key.Name, DisplayName(tableSchema, tableName)); - var primaryKey = new DatabasePrimaryKey(table, primaryKeyGroup.Key.Name); + var primaryKey = new DatabasePrimaryKey { Table = table, Name = primaryKeyGroup.Key.Name }; if (primaryKeyGroup.Key.TypeDesc == "NONCLUSTERED") { @@ -886,7 +892,7 @@ FROM [sys].[indexes] i { _logger.UniqueConstraintFound(uniqueConstraintGroup.Key.Name, DisplayName(tableSchema, tableName)); - var uniqueConstraint = new DatabaseUniqueConstraint(table, uniqueConstraintGroup.Key.Name); + var uniqueConstraint = new DatabaseUniqueConstraint { Table = table, Name = uniqueConstraintGroup.Key.Name }; if (uniqueConstraintGroup.Key.TypeDesc == "CLUSTERED") { @@ -924,8 +930,10 @@ FROM [sys].[indexes] i { _logger.IndexFound(indexGroup.Key.Name, DisplayName(tableSchema, tableName), indexGroup.Key.IsUnique); - var index = new DatabaseIndex(table, indexGroup.Key.Name) + var index = new DatabaseIndex { + Table = table, + Name = indexGroup.Key.Name, IsUnique = indexGroup.Key.IsUnique, Filter = indexGroup.Key.HasFilter ? indexGroup.Key.FilterDefinition : null }; @@ -1009,7 +1017,7 @@ FROM [sys].[foreign_keys] AS [f] t => t.Schema == principalTableSchema && t.Name == principalTableName) ?? tables.FirstOrDefault( - t => t.Schema?.Equals(principalTableSchema, StringComparison.OrdinalIgnoreCase) == true + t => t.Schema.Equals(principalTableSchema, StringComparison.OrdinalIgnoreCase) && t.Name.Equals(principalTableName, StringComparison.OrdinalIgnoreCase)); if (principalTable == null) @@ -1022,8 +1030,11 @@ FROM [sys].[foreign_keys] AS [f] continue; } - var foreignKey = new DatabaseForeignKey(table, fkName, principalTable) + var foreignKey = new DatabaseForeignKey { + Name = fkName, + Table = table, + PrincipalTable = principalTable, OnDelete = ConvertToReferentialAction(onDeleteAction) }; @@ -1108,7 +1119,7 @@ FROM sys.databases return result != null ? Convert.ToByte(result) : (byte)0; } - private static string DisplayName(string? schema, string name) + private static string DisplayName(string schema, string name) => (!string.IsNullOrEmpty(schema) ? schema + "." : "") + name; private static ReferentialAction? ConvertToReferentialAction(string onDeleteAction) diff --git a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteCodeGenerator.cs b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteCodeGenerator.cs index 1d59b4444e4..58ac03204c0 100644 --- a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteCodeGenerator.cs +++ b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteCodeGenerator.cs @@ -5,8 +5,6 @@ using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore.Scaffolding; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Sqlite.Scaffolding.Internal { /// @@ -34,7 +32,7 @@ public SqliteCodeGenerator([NotNull] ProviderCodeGeneratorDependencies dependenc /// public override MethodCallCodeFragment GenerateUseProvider( string connectionString, - MethodCallCodeFragment? providerOptions) + MethodCallCodeFragment providerOptions) => new MethodCallCodeFragment( nameof(SqliteDbContextOptionsBuilderExtensions.UseSqlite), providerOptions == null diff --git a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs index 4d66c5b4e31..094a0895b25 100644 --- a/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs +++ b/src/EFCore.Sqlite.Core/Scaffolding/Internal/SqliteDatabaseModelFactory.cs @@ -19,8 +19,6 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Utilities; -#nullable enable - namespace Microsoft.EntityFrameworkCore.Sqlite.Scaffolding.Internal { /// @@ -96,15 +94,23 @@ public override DatabaseModel Create(DbConnection connection, DatabaseModelFacto { databaseModel.DatabaseName = GetDatabaseName(connection); - GetTables(connection, databaseModel, options.Tables); + foreach (var table in GetTables(connection, options.Tables)) + { + table.Database = databaseModel; + databaseModel.Tables.Add(table); + } foreach (var table in databaseModel.Tables) { - GetForeignKeys(connection, table, databaseModel.Tables); + foreach (var foreignKey in GetForeignKeys(connection, table, databaseModel.Tables)) + { + foreignKey.Table = table; + table.ForeignKeys.Add(foreignKey); + } } var nullableKeyColumns = databaseModel.Tables - .SelectMany(t => t.PrimaryKey?.Columns ?? Array.Empty()) + .Where(t => t.PrimaryKey != null).SelectMany(t => t.PrimaryKey.Columns) .Concat(databaseModel.Tables.SelectMany(t => t.ForeignKeys).SelectMany(fk => fk.PrincipalColumns)) .Where(c => c.IsNullable) .Distinct(); @@ -136,7 +142,7 @@ private static string GetDatabaseName(DbConnection connection) return name; } - private void GetTables(DbConnection connection, DatabaseModel databaseModel, IEnumerable tables) + private IEnumerable GetTables(DbConnection connection, IEnumerable tables) { var tablesToSelect = new HashSet(tables.ToList(), StringComparer.OrdinalIgnoreCase); var selectedTables = new HashSet(StringComparer.OrdinalIgnoreCase); @@ -171,15 +177,37 @@ private void GetTables(DbConnection connection, DatabaseModel databaseModel, IEn var type = reader.GetString(1); var table = type == "table" - ? new DatabaseTable(databaseModel, name) - : new DatabaseView(databaseModel, name); + ? new DatabaseTable() + : new DatabaseView(); - GetColumns(connection, table); - GetPrimaryKey(connection, table); - GetUniqueConstraints(connection, table); - GetIndexes(connection, table); + table.Name = name; - databaseModel.Tables.Add(table); + foreach (var column in GetColumns(connection, name)) + { + column.Table = table; + table.Columns.Add(column); + } + + var primaryKey = GetPrimaryKey(connection, name, table.Columns); + if (primaryKey != null) + { + primaryKey.Table = table; + table.PrimaryKey = primaryKey; + } + + foreach (var uniqueConstraints in GetUniqueConstraints(connection, name, table.Columns)) + { + uniqueConstraints.Table = table; + table.UniqueConstraints.Add(uniqueConstraints); + } + + foreach (var index in GetIndexes(connection, name, table.Columns)) + { + index.Table = table; + table.Indexes.Add(index); + } + + yield return table; } } @@ -205,7 +233,7 @@ private static bool AllowsTable(HashSet tables, HashSet selected return false; } - private void GetColumns(DbConnection connection, DatabaseTable table) + private IEnumerable GetColumns(DbConnection connection, string table) { using var command = connection.CreateCommand(); command.CommandText = new StringBuilder() @@ -216,7 +244,7 @@ private void GetColumns(DbConnection connection, DatabaseTable table) var parameter = command.CreateParameter(); parameter.ParameterName = "@table"; - parameter.Value = table.Name; + parameter.Value = table; command.Parameters.Add(parameter); using var reader = command.ExecuteReader(); @@ -229,17 +257,19 @@ private void GetColumns(DbConnection connection, DatabaseTable table) ? FilterClrDefaults(dataType, notNull, reader.GetString(3)) : null; - _logger.ColumnFound(table.Name, columnName, dataType, notNull, defaultValue); + _logger.ColumnFound(table, columnName, dataType, notNull, defaultValue); - table.Columns.Add(new DatabaseColumn(table, columnName, dataType) + yield return new DatabaseColumn { + Name = columnName, + StoreType = dataType, IsNullable = !notNull, DefaultValueSql = defaultValue - }); + }; } } - private string? FilterClrDefaults(string dataType, bool notNull, string defaultValue) + private string FilterClrDefaults(string dataType, bool notNull, string defaultValue) { if (string.Equals(defaultValue, "null", StringComparison.OrdinalIgnoreCase)) { @@ -259,62 +289,65 @@ private void GetColumns(DbConnection connection, DatabaseTable table) return defaultValue; } - private void GetPrimaryKey(DbConnection connection, DatabaseTable table) + private DatabasePrimaryKey GetPrimaryKey(DbConnection connection, string table, IList columns) { - using var command = connection.CreateCommand(); - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_list(@table)") - .AppendLine("WHERE \"origin\" = 'pk'") - .AppendLine("ORDER BY \"seq\";") - .ToString(); - - var parameter = command.CreateParameter(); - parameter.ParameterName = "@table"; - parameter.Value = table.Name; - command.Parameters.Add(parameter); + var primaryKey = new DatabasePrimaryKey(); - var name = (string)command.ExecuteScalar(); - if (name == null) + using (var command = connection.CreateCommand()) { - GetRowidPrimaryKey(connection, table); - return; - } + command.CommandText = new StringBuilder() + .AppendLine("SELECT \"name\"") + .AppendLine("FROM pragma_index_list(@table)") + .AppendLine("WHERE \"origin\" = 'pk'") + .AppendLine("ORDER BY \"seq\";") + .ToString(); - var primaryKey = new DatabasePrimaryKey( - table, - name.StartsWith("sqlite_", StringComparison.Ordinal) - ? string.Empty - : name); + var parameter = command.CreateParameter(); + parameter.ParameterName = "@table"; + parameter.Value = table; + command.Parameters.Add(parameter); - _logger.PrimaryKeyFound(name, table.Name); + var name = (string)command.ExecuteScalar(); + if (name == null) + { + return GetRowidPrimaryKey(connection, table, columns); + } - command.CommandText = new StringBuilder() - .AppendLine("SELECT \"name\"") - .AppendLine("FROM pragma_index_info(@index)") - .AppendLine("ORDER BY \"seqno\";") - .ToString(); + if (!name.StartsWith("sqlite_", StringComparison.Ordinal)) + { + primaryKey.Name = name; + } - parameter.ParameterName = "@index"; - parameter.Value = name; + _logger.PrimaryKeyFound(name, table); - using var reader = command.ExecuteReader(); - while (reader.Read()) - { - var columnName = reader.GetString(0); - var column = table.Columns.FirstOrDefault(c => c.Name == columnName) - ?? table.Columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); - Check.DebugAssert(column != null, "column is null."); + command.CommandText = new StringBuilder() + .AppendLine("SELECT \"name\"") + .AppendLine("FROM pragma_index_info(@index)") + .AppendLine("ORDER BY \"seqno\";") + .ToString(); - primaryKey.Columns.Add(column); + parameter.ParameterName = "@index"; + parameter.Value = name; + + using var reader = command.ExecuteReader(); + while (reader.Read()) + { + var columnName = reader.GetString(0); + var column = columns.FirstOrDefault(c => c.Name == columnName) + ?? columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); + Check.DebugAssert(column != null, "column is null."); + + primaryKey.Columns.Add(column); + } } - table.PrimaryKey = primaryKey; + return primaryKey; } - private static void GetRowidPrimaryKey( + private static DatabasePrimaryKey GetRowidPrimaryKey( DbConnection connection, - DatabaseTable table) + string table, + IList columns) { using var command = connection.CreateCommand(); command.CommandText = new StringBuilder() @@ -325,26 +358,29 @@ private static void GetRowidPrimaryKey( var parameter = command.CreateParameter(); parameter.ParameterName = "@table"; - parameter.Value = table.Name; + parameter.Value = table; command.Parameters.Add(parameter); using var reader = command.ExecuteReader(); if (!reader.Read()) { - return; + return null; } var columnName = reader.GetString(0); - var column = table.Columns.FirstOrDefault(c => c.Name == columnName) - ?? table.Columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); + var column = columns.FirstOrDefault(c => c.Name == columnName) + ?? columns.FirstOrDefault(c => c.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); Check.DebugAssert(column != null, "column is null."); Check.DebugAssert(!reader.Read(), "Unexpected composite primary key."); - table.PrimaryKey = new DatabasePrimaryKey(table, string.Empty) { Columns = { column } }; + return new DatabasePrimaryKey { Columns = { column } }; } - private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) + private IEnumerable GetUniqueConstraints( + DbConnection connection, + string table, + IList columns) { using var command1 = connection.CreateCommand(); command1.CommandText = new StringBuilder() @@ -356,20 +392,20 @@ private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) var parameter1 = command1.CreateParameter(); parameter1.ParameterName = "@table"; - parameter1.Value = table.Name; + parameter1.Value = table; command1.Parameters.Add(parameter1); using var reader1 = command1.ExecuteReader(); while (reader1.Read()) { - var constraintName = reader1.GetString(0); - var uniqueConstraint = new DatabaseUniqueConstraint( - table, - constraintName.StartsWith("sqlite_", StringComparison.Ordinal) - ? string.Empty - : constraintName); + var uniqueConstraint = new DatabaseUniqueConstraint(); + var name = reader1.GetString(0); + if (!name.StartsWith("sqlite_", StringComparison.Ordinal)) + { + uniqueConstraint.Name = name; + } - _logger.UniqueConstraintFound(constraintName, table.Name); + _logger.UniqueConstraintFound(name, table); using (var command2 = connection.CreateCommand()) { @@ -381,15 +417,15 @@ private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) var parameter2 = command2.CreateParameter(); parameter2.ParameterName = "@index"; - parameter2.Value = constraintName; + parameter2.Value = name; command2.Parameters.Add(parameter2); using var reader2 = command2.ExecuteReader(); while (reader2.Read()) { var columnName = reader2.GetString(0); - var column = table.Columns.FirstOrDefault(c => c.Name == columnName) - ?? table.Columns.FirstOrDefault( + var column = columns.FirstOrDefault(c => c.Name == columnName) + ?? columns.FirstOrDefault( c => c.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase)); Check.DebugAssert(column != null, "column is null."); @@ -397,11 +433,14 @@ private void GetUniqueConstraints(DbConnection connection, DatabaseTable table) } } - table.UniqueConstraints.Add(uniqueConstraint); + yield return uniqueConstraint; } } - private void GetIndexes(DbConnection connection, DatabaseTable table) + private IEnumerable GetIndexes( + DbConnection connection, + string table, + IList columns) { using var command1 = connection.CreateCommand(); command1.CommandText = new StringBuilder() @@ -413,15 +452,15 @@ private void GetIndexes(DbConnection connection, DatabaseTable table) var parameter1 = command1.CreateParameter(); parameter1.ParameterName = "@table"; - parameter1.Value = table.Name; + parameter1.Value = table; command1.Parameters.Add(parameter1); using var reader1 = command1.ExecuteReader(); while (reader1.Read()) { - var index = new DatabaseIndex(table, reader1.GetString(0)) { IsUnique = reader1.GetBoolean(1) }; + var index = new DatabaseIndex { Name = reader1.GetString(0), IsUnique = reader1.GetBoolean(1) }; - _logger.IndexFound(index.Name, table.Name, index.IsUnique); + _logger.IndexFound(index.Name, table, index.IsUnique); using (var command2 = connection.CreateCommand()) { @@ -440,19 +479,19 @@ private void GetIndexes(DbConnection connection, DatabaseTable table) while (reader2.Read()) { var name = reader2.GetString(0); - var column = table.Columns.FirstOrDefault(c => c.Name == name) - ?? table.Columns.FirstOrDefault(c => c.Name.Equals(name, StringComparison.Ordinal)); + var column = columns.FirstOrDefault(c => c.Name == name) + ?? columns.FirstOrDefault(c => c.Name.Equals(name, StringComparison.Ordinal)); Check.DebugAssert(column != null, "column is null."); index.Columns.Add(column); } } - table.Indexes.Add(index); + yield return index; } } - private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList tables) + private IEnumerable GetForeignKeys(DbConnection connection, DatabaseTable table, IList tables) { using var command1 = connection.CreateCommand(); command1.CommandText = new StringBuilder() @@ -472,11 +511,11 @@ private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList< var id = reader1.GetInt64(0); var principalTableName = reader1.GetString(1); var onDelete = reader1.GetString(2); - var principalTable = tables.FirstOrDefault(t => t.Name == principalTableName) - ?? tables.FirstOrDefault( - t => t.Name.Equals(principalTableName, StringComparison.OrdinalIgnoreCase)); - var foreignKey = new DatabaseForeignKey(table, string.Empty, principalTable) + var foreignKey = new DatabaseForeignKey { + PrincipalTable = tables.FirstOrDefault(t => t.Name == principalTableName) + ?? tables.FirstOrDefault( + t => t.Name.Equals(principalTableName, StringComparison.OrdinalIgnoreCase)), OnDelete = ConvertToReferentialAction(onDelete) }; @@ -538,7 +577,7 @@ private void GetForeignKeys(DbConnection connection, DatabaseTable table, IList< if (!invalid) { - table.ForeignKeys.Add(foreignKey); + yield return foreignKey; } } } diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpUniqueNamerTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpUniqueNamerTest.cs index a2bd78d65a7..4fd7960f44d 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpUniqueNamerTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/CSharpUniqueNamerTest.cs @@ -14,9 +14,8 @@ public class CSharpUniqueNamerTest public void Returns_unique_name_for_type() { var namer = new CSharpUniqueNamer(s => s.Name, new CSharpUtilities(), null); - var table = new DatabaseTable(new DatabaseModel(), "foo"); - var input1 = new DatabaseColumn(table, "Id", "int"); - var input2 = new DatabaseColumn(table, "Id", "int"); + var input1 = new DatabaseColumn { Name = "Id" }; + var input2 = new DatabaseColumn { Name = "Id" }; Assert.Equal("Id", namer.GetName(input1)); Assert.Equal("Id", namer.GetName(input1)); @@ -28,9 +27,8 @@ public void Returns_unique_name_for_type() public void Uses_comparer() { var namer = new CSharpUniqueNamer(t => t.Name, new CSharpUtilities(), null); - var database = new DatabaseModel(); - var table1 = new DatabaseTable(database, "A B C"); - var table2 = new DatabaseTable(database, "A_B_C"); + var table1 = new DatabaseTable { Name = "A B C" }; + var table2 = new DatabaseTable { Name = "A_B_C" }; Assert.Equal("A_B_C", namer.GetName(table1)); Assert.Equal("A_B_C1", namer.GetName(table2)); } @@ -42,7 +40,7 @@ public void Singularizes_names(string input, string output) { var fakePluralizer = new RelationalDatabaseModelFactoryTest.FakePluralizer(); var namer = new CSharpUniqueNamer(t => t.Name, new CSharpUtilities(), fakePluralizer.Singularize); - var table = new DatabaseTable(new DatabaseModel(), input); + var table = new DatabaseTable { Name = input }; Assert.Equal(output, namer.GetName(table)); } @@ -53,7 +51,7 @@ public void Pluralizes_names(string input, string output) { var fakePluralizer = new RelationalDatabaseModelFactoryTest.FakePluralizer(); var namer = new CSharpUniqueNamer(t => t.Name, new CSharpUtilities(), fakePluralizer.Pluralize); - var table = new DatabaseTable(new DatabaseModel(), input); + var table = new DatabaseTable { Name = input }; Assert.Equal(output, namer.GetName(table)); } } diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/CandidateNamingServiceTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/CandidateNamingServiceTest.cs index 615a8020863..fd9a41fe9a5 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/CandidateNamingServiceTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/CandidateNamingServiceTest.cs @@ -24,7 +24,7 @@ public void Generates_candidate_identifiers(string input, string output) { Assert.Equal( output, new CandidateNamingService().GenerateCandidateIdentifier( - new DatabaseTable(new DatabaseModel(), input))); + new DatabaseTable { Name = input })); } } } diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs index 7552acfa95b..bb60acd1b8a 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs @@ -22,18 +22,9 @@ public class RelationalDatabaseModelFactoryTest private readonly IScaffoldingModelFactory _factory; private readonly TestOperationReporter _reporter; - private static readonly DatabaseModel Database; - private static readonly DatabaseTable Table; - private static readonly DatabaseColumn IdColumn; - private static readonly DatabasePrimaryKey IdPrimaryKey; + private static DatabaseColumn IdColumn => new DatabaseColumn { Name = "Id", StoreType = "int" }; - static RelationalDatabaseModelFactoryTest() - { - Database = new DatabaseModel(); - Table = new DatabaseTable(Database, "Foo"); - IdColumn = new DatabaseColumn(Table, "Id", "int"); - IdPrimaryKey = new DatabasePrimaryKey(Table, "IdPrimaryKey") { Columns = { IdColumn } }; - } + private static readonly DatabasePrimaryKey IdPrimaryKey = new DatabasePrimaryKey { Columns = { IdColumn } }; public RelationalDatabaseModelFactoryTest() { @@ -56,19 +47,21 @@ public void Creates_entity_types() { Tables = { - new DatabaseTable(Database, "tableWithSchema") + new DatabaseTable { + Name = "tableWithSchema", Schema = "public", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }, - new DatabaseTable(Database, "noSchema") + new DatabaseTable { + Name = "noSchema", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }, - new DatabaseTable(Database, "noPrimaryKey"), - new DatabaseView(Database, "view") + new DatabaseTable { Name = "noPrimaryKey" }, + new DatabaseView { Name = "view" } } }; var model = _factory.Create(info, false); @@ -105,13 +98,15 @@ public void Creates_entity_types_case_insensitive() { Tables = { - new DatabaseTable(Database, "TestTable") + new DatabaseTable { + Name = "TestTable", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }, - new DatabaseTable(Database, "TESTTABLE") + new DatabaseTable { + Name = "TESTTABLE", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey } @@ -128,30 +123,41 @@ public void Loads_column_types() { Tables = { - new DatabaseTable(Database, "Jobs") + new DatabaseTable { + Name = "Jobs", Columns = { IdColumn, - new DatabaseColumn(Table, "occupation", "nvarchar(max)") + new DatabaseColumn { + Name = "occupation", + StoreType = "nvarchar(max)", DefaultValueSql = "\"dev\"" }, - new DatabaseColumn(Table, "salary", "int") + new DatabaseColumn { + Name = "salary", + StoreType = "int", IsNullable = true }, - new DatabaseColumn(Table, "modified", "nvarchar(max)") + new DatabaseColumn { + Name = "modified", + StoreType = "nvarchar(max)", IsNullable = false, ValueGenerated = ValueGenerated.OnAddOrUpdate }, - new DatabaseColumn(Table, "created", "nvarchar(max)") + new DatabaseColumn { + Name = "created", + StoreType = "nvarchar(max)", ValueGenerated = ValueGenerated.OnAdd }, - new DatabaseColumn(Table, "current", "nvarchar(max)") + new DatabaseColumn { + Name = "current", + StoreType = "nvarchar(max)", ComputedColumnSql = "compute_this()" } }, @@ -209,14 +215,15 @@ public void Use_database_names_for_columns() { Tables = { - new DatabaseTable(Database, "NaturalProducts") + new DatabaseTable { + Name = "NaturalProducts", Columns = { IdColumn, - new DatabaseColumn(Table, "ProductSKU", "nvarchar(max)"), - new DatabaseColumn(Table, "supplierID", "nvarchar(max)"), - new DatabaseColumn(Table, "Vendor_Discount", "nvarchar(max)") + new DatabaseColumn { Name = "ProductSKU", StoreType = "nvarchar(max)" }, + new DatabaseColumn { Name = "supplierID", StoreType = "nvarchar(max)" }, + new DatabaseColumn { Name = "Vendor_Discount", StoreType = "nvarchar(max)" } }, PrimaryKey = IdPrimaryKey } @@ -240,14 +247,15 @@ public void Do_not_use_database_names_for_columns() { Tables = { - new DatabaseTable(Database, "NaturalProducts") + new DatabaseTable { + Name = "NaturalProducts", Columns = { IdColumn, - new DatabaseColumn(Table, "ProductSKU", "nvarchar(max)"), - new DatabaseColumn(Table, "supplierID", "nvarchar(max)"), - new DatabaseColumn(Table, "Vendor_Discount", "nvarchar(max)") + new DatabaseColumn { Name = "ProductSKU", StoreType = "nvarchar(max)" }, + new DatabaseColumn { Name = "supplierID", StoreType = "nvarchar(max)" }, + new DatabaseColumn { Name = "Vendor_Discount", StoreType = "nvarchar(max)" } }, PrimaryKey = IdPrimaryKey } @@ -269,16 +277,17 @@ public void Do_not_use_database_names_for_columns() [InlineData("datetime2(4)", "datetime2(4)")] public void Column_type_annotation(string StoreType, string expectedColumnType) { - var column = new DatabaseColumn(Table, "Col", StoreType); + var column = new DatabaseColumn { Name = "Col", StoreType = StoreType }; var info = new DatabaseModel { Tables = { - new DatabaseTable(Database, "A") + new DatabaseTable { + Name = "A", Columns = { column }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { column } } + PrimaryKey = new DatabasePrimaryKey { Columns = { column } } } } }; @@ -291,20 +300,21 @@ public void Column_type_annotation(string StoreType, string expectedColumnType) [ConditionalFact] public void Column_ordinal_annotation() { - var col1 = new DatabaseColumn(Table, "Col1", "nvarchar(max)"); + var col1 = new DatabaseColumn { Name = "Col1", StoreType = "nvarchar(max)" }; var info = new DatabaseModel { Tables = { - new DatabaseTable(Database, "A") + new DatabaseTable { + Name = "A", Columns = { col1, - new DatabaseColumn(Table, "Col2", "nvarchar(max)"), - new DatabaseColumn(Table, "Col3", "nvarchar(max)") + new DatabaseColumn { Name = "Col2", StoreType = "nvarchar(max)" }, + new DatabaseColumn { Name = "Col3", StoreType = "nvarchar(max)" } }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { col1 } } + PrimaryKey = new DatabasePrimaryKey { Columns = { col1 } } } } }; @@ -328,15 +338,23 @@ public void Unmappable_column_type(string StoreType) { Tables = { - new DatabaseTable(Database, "E") + new DatabaseTable { + Name = "E", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey } } }; - info.Tables.First().Columns.Add(new DatabaseColumn(info.Tables.First(), "Coli", StoreType)); + info.Tables.First() + .Columns.Add( + new DatabaseColumn + { + Table = info.Tables.First(), + Name = "Coli", + StoreType = StoreType + }); Assert.Single(_factory.Create(info, false).FindEntityType("E").GetProperties()); Assert.Single(_reporter.Messages, t => t.Contains(DesignStrings.CannotFindTypeMappingForColumn("E.Coli", StoreType))); @@ -352,9 +370,10 @@ public void Primary_key(string[] keyProps, int length) { var info = new DatabaseModel { - Tables = { new DatabaseTable(Database, "PkTable") { PrimaryKey = new DatabasePrimaryKey(Table, "MyPk") } } + Tables = { new DatabaseTable { Name = "PkTable", PrimaryKey = new DatabasePrimaryKey { Name = "MyPk" } } } }; - foreach (var column in keyProps.Select(k => new DatabaseColumn(Table, k, "int"))) + foreach (var column in keyProps.Select( + k => new DatabaseColumn { Name = k, StoreType = "int" })) { info.Tables[0].Columns.Add(column); info.Tables[0].PrimaryKey.Columns.Add(column); @@ -369,17 +388,18 @@ public void Primary_key(string[] keyProps, int length) [ConditionalFact] public void Unique_constraint() { - var myColumn = new DatabaseColumn(Table, "MyColumn", "int"); + var myColumn = new DatabaseColumn { Name = "MyColumn", StoreType = "int" }; var databaseModel = new DatabaseModel { Tables = { - new DatabaseTable(Database, "MyTable") + new DatabaseTable { + Name = "MyTable", Columns = { IdColumn, myColumn }, PrimaryKey = IdPrimaryKey, - UniqueConstraints = { new DatabaseUniqueConstraint(Table, "MyUniqueConstraint") { Columns = { myColumn } } } + UniqueConstraints = { new DatabaseUniqueConstraint { Name = "MyUniqueConstraint", Columns = { myColumn } } } } } }; @@ -395,38 +415,43 @@ public void Unique_constraint() [ConditionalFact] public void Indexes_and_alternate_keys() { - var c1 = new DatabaseColumn(Table, "C1", "int"); - var table = new DatabaseTable(Database, "T") + var c1 = new DatabaseColumn { Name = "C1", StoreType = "int" }; + var table = new DatabaseTable { + Name = "T", Columns = { c1, - new DatabaseColumn(Table, "C2", "int"), - new DatabaseColumn(Table, "C3", "int") + new DatabaseColumn { Name = "C2", StoreType = "int" }, + new DatabaseColumn { Name = "C3", StoreType = "int" } }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { c1 } } + PrimaryKey = new DatabasePrimaryKey { Columns = { c1 } } }; table.Indexes.Add( - new DatabaseIndex(Table, "IDX_C1") + new DatabaseIndex { + Name = "IDX_C1", Columns = { table.Columns.ElementAt(0) }, IsUnique = false }); table.Indexes.Add( - new DatabaseIndex(Table, "UNQ_C2") + new DatabaseIndex { + Name = "UNQ_C2", Columns = { table.Columns.ElementAt(1) }, IsUnique = true }); table.Indexes.Add( - new DatabaseIndex(Table, "IDX_C2_C1") + new DatabaseIndex { + Name = "IDX_C2_C1", Columns = { table.Columns.ElementAt(1), table.Columns.ElementAt(0) }, IsUnique = false }); table.Indexes.Add( - new DatabaseIndex(Table, "UNQ_C3_C1") + new DatabaseIndex { + /*Name ="UNQ_C3_C1",*/ Columns = { table.Columns.ElementAt(2), table.Columns.ElementAt(0) }, IsUnique = true }); @@ -466,23 +491,32 @@ public void Indexes_and_alternate_keys() [ConditionalFact] public void Foreign_key() { - var parentTable = new DatabaseTable(Database, "Parent") + var parentTable = new DatabaseTable { + Name = "Parent", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }; - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { + Name = "Children", Columns = { IdColumn, - new DatabaseColumn(Table, "ParentId", "int") { IsNullable = true } + new DatabaseColumn + { + Name = "ParentId", + StoreType = "int", + IsNullable = true + } }, PrimaryKey = IdPrimaryKey }; childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, OnDelete = ReferentialAction.Cascade, Columns = { childrenTable.Columns.ElementAt(1) }, PrincipalColumns = { parentTable.Columns.ElementAt(0) } @@ -510,26 +544,35 @@ public void Foreign_key() [ConditionalFact] public void Foreign_key_to_unique_constraint() { - var keyColumn = new DatabaseColumn(Table, "Key", "int") { IsNullable = false }; + var keyColumn = new DatabaseColumn + { + Name = "Key", + StoreType = "int", + IsNullable = false + }; - var parentTable = new DatabaseTable(Database, "Parent") + var parentTable = new DatabaseTable { + Name = "Parent", Columns = { IdColumn, keyColumn }, PrimaryKey = IdPrimaryKey }; parentTable.UniqueConstraints.Add( - new DatabaseUniqueConstraint(parentTable, "AK_Foo") { Columns = { keyColumn } }); + new DatabaseUniqueConstraint { Table = parentTable, Columns = { keyColumn } }); - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { + Name = "Children", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }; childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, OnDelete = ReferentialAction.Cascade, Columns = { childrenTable.Columns.ElementAt(0) }, PrincipalColumns = { parentTable.Columns.ElementAt(1) } @@ -557,19 +600,23 @@ public void Foreign_key_to_unique_constraint() [ConditionalFact] public void Unique_foreign_key() { - var parentTable = new DatabaseTable(Database, "Parent") + var parentTable = new DatabaseTable { + Name = "Parent", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }; - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { + Name = "Children", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }; childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, OnDelete = ReferentialAction.NoAction, Columns = { childrenTable.Columns.ElementAt(0) }, PrincipalColumns = { parentTable.Columns.ElementAt(0) } @@ -589,26 +636,30 @@ public void Unique_foreign_key() [ConditionalFact] public void Composite_foreign_key() { - var ida = new DatabaseColumn(Table, "Id_A", "int"); - var idb = new DatabaseColumn(Table, "Id_B", "int"); - var parentTable = new DatabaseTable(Database, "Parent") + var ida = new DatabaseColumn { Name = "Id_A", StoreType = "int" }; + var idb = new DatabaseColumn { Name = "Id_B", StoreType = "int" }; + var parentTable = new DatabaseTable { + Name = "Parent", Columns = { ida, idb }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { ida, idb } } + PrimaryKey = new DatabasePrimaryKey { Columns = { ida, idb } } }; - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { + Name = "Children", Columns = { IdColumn, - new DatabaseColumn(Table, "ParentId_A", "int"), - new DatabaseColumn(Table, "ParentId_B", "int") + new DatabaseColumn { Name = "ParentId_A", StoreType = "int" }, + new DatabaseColumn { Name = "ParentId_B", StoreType = "int" } }, PrimaryKey = IdPrimaryKey }; childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, OnDelete = ReferentialAction.SetNull, Columns = { childrenTable.Columns.ElementAt(1), childrenTable.Columns.ElementAt(2) }, PrincipalColumns = { parentTable.Columns.ElementAt(0), parentTable.Columns.ElementAt(1) } @@ -638,18 +689,26 @@ public void Composite_foreign_key() [ConditionalFact] public void It_loads_self_referencing_foreign_key() { - var table = new DatabaseTable(Database, "ItemsList") + var table = new DatabaseTable { + Name = "ItemsList", Columns = { IdColumn, - new DatabaseColumn(Table, "ParentId", "int") { IsNullable = false } + new DatabaseColumn + { + Name = "ParentId", + StoreType = "int", + IsNullable = false + } }, PrimaryKey = IdPrimaryKey }; table.ForeignKeys.Add( - new DatabaseForeignKey(table, "FK_Foo", table) + new DatabaseForeignKey { + Table = table, + PrincipalTable = table, Columns = { table.Columns.ElementAt(1) }, PrincipalColumns = { table.Columns.ElementAt(0) } }); @@ -670,19 +729,23 @@ public void It_loads_self_referencing_foreign_key() [ConditionalFact] public void It_logs_warning_for_bad_foreign_key() { - var parentTable = new DatabaseTable(Database, "Parent") + var parentTable = new DatabaseTable { - Columns = { IdColumn, new DatabaseColumn(Table, "NotPkId", "int") }, + Name = "Parent", + Columns = { IdColumn, new DatabaseColumn { Name = "NotPkId", StoreType = "int" } }, PrimaryKey = IdPrimaryKey }; - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { - Columns = { IdColumn, new DatabaseColumn(Table, "ParentId", "int") }, + Name = "Children", + Columns = { IdColumn, new DatabaseColumn { Name = "ParentId", StoreType = "int" } }, PrimaryKey = IdPrimaryKey }; childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, Columns = { childrenTable.Columns.ElementAt(1) }, PrincipalColumns = { parentTable.Columns.ElementAt(1) } }); @@ -701,20 +764,28 @@ public void It_logs_warning_for_bad_foreign_key() [ConditionalFact] public void Unique_nullable_index_unused_by_foreign_key() { - var table = new DatabaseTable(Database, "Friends") + var table = new DatabaseTable { + Name = "Friends", Columns = { IdColumn, - new DatabaseColumn(Table, "BuddyId", "int") { IsNullable = true } + new DatabaseColumn + { + Name = "BuddyId", + StoreType = "int", + IsNullable = true + } }, PrimaryKey = IdPrimaryKey }; table.Indexes.Add( - new DatabaseIndex(Table, "IX_Foo") { Columns = { table.Columns.ElementAt(1) }, IsUnique = true }); + new DatabaseIndex { Columns = { table.Columns.ElementAt(1) }, IsUnique = true }); table.ForeignKeys.Add( - new DatabaseForeignKey(table, "FK_Foo", table) + new DatabaseForeignKey { + Table = table, + PrincipalTable = table, Columns = { table.Columns.ElementAt(1) }, PrincipalColumns = { table.Columns.ElementAt(0) } }); @@ -737,24 +808,33 @@ public void Unique_nullable_index_unused_by_foreign_key() [ConditionalFact] public void Unique_nullable_index_used_by_foreign_key() { - var table = new DatabaseTable(Database, "Friends") + var table = new DatabaseTable { + Name = "Friends", Columns = { IdColumn, - new DatabaseColumn(Table, "BuddyId", "int") { IsNullable = true } + new DatabaseColumn + { + Name = "BuddyId", + StoreType = "int", + IsNullable = true + } }, PrimaryKey = IdPrimaryKey }; table.Indexes.Add( - new DatabaseIndex(Table, "FriendsNameUniqueIndex") + new DatabaseIndex { + Name = "FriendsNameUniqueIndex", Columns = { table.Columns.ElementAt(1) }, IsUnique = true }); table.ForeignKeys.Add( - new DatabaseForeignKey(table, "FK_Foo", table) + new DatabaseForeignKey { + Table = table, + PrincipalTable = table, Columns = { table.Columns.ElementAt(1) }, PrincipalColumns = { table.Columns.ElementAt(1) } }); @@ -783,31 +863,35 @@ public void Unique_nullable_index_used_by_foreign_key() [ConditionalFact] public void Unique_index_composite_foreign_key() { - var ida = new DatabaseColumn(Table, "Id_A", "int"); - var idb = new DatabaseColumn(Table, "Id_B", "int"); - var parentTable = new DatabaseTable(Database, "Parent") + var ida = new DatabaseColumn { Name = "Id_A", StoreType = "int" }; + var idb = new DatabaseColumn { Name = "Id_B", StoreType = "int" }; + var parentTable = new DatabaseTable { + Name = "Parent", Columns = { ida, idb }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { ida, idb } } + PrimaryKey = new DatabasePrimaryKey { Columns = { ida, idb } } }; - var childrenTable = new DatabaseTable(Database, "Children") + var childrenTable = new DatabaseTable { + Name = "Children", Columns = { IdColumn, - new DatabaseColumn(Table, "ParentId_A", "int"), - new DatabaseColumn(Table, "ParentId_B", "int") + new DatabaseColumn { Name = "ParentId_A", StoreType = "int" }, + new DatabaseColumn { Name = "ParentId_B", StoreType = "int" } }, PrimaryKey = IdPrimaryKey }; childrenTable.Indexes.Add( - new DatabaseIndex(Table, "IX_Foo") + new DatabaseIndex { IsUnique = true, Columns = { childrenTable.Columns.ElementAt(1), childrenTable.Columns.ElementAt(2) } }); childrenTable.ForeignKeys.Add( - new DatabaseForeignKey(childrenTable, "FK_Foo", parentTable) + new DatabaseForeignKey { + Table = childrenTable, + PrincipalTable = parentTable, Columns = { childrenTable.Columns.ElementAt(1), childrenTable.Columns.ElementAt(2) }, PrincipalColumns = { parentTable.Columns.ElementAt(0), parentTable.Columns.ElementAt(1) } }); @@ -831,18 +915,20 @@ public void Unique_names() { Tables = { - new DatabaseTable(Database, "E F") + new DatabaseTable { + Name = "E F", Columns = { IdColumn, - new DatabaseColumn(Table, "San itized", "int"), - new DatabaseColumn(Table, "San+itized", "int") + new DatabaseColumn { Name = "San itized", StoreType = "int" }, + new DatabaseColumn { Name = "San+itized", StoreType = "int" } }, PrimaryKey = IdPrimaryKey }, - new DatabaseTable(Database, "E+F") + new DatabaseTable { + Name = "E+F", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey } @@ -884,7 +970,7 @@ public void Unique_names() [ConditionalFact] public void Sequences() { - var info = new DatabaseModel { Sequences = { new DatabaseSequence(Database, "CountByThree") { IncrementBy = 3 } } }; + var info = new DatabaseModel { Sequences = { new DatabaseSequence { Name = "CountByThree", IncrementBy = 3 } } }; var model = _factory.Create(info, false); @@ -908,8 +994,9 @@ public void DbSet_annotation_is_set() { Tables = { - new DatabaseTable(Database, "Blog") + new DatabaseTable { + Name = "Blog", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey } @@ -927,13 +1014,15 @@ public void Pluralization_of_entity_and_DbSet() { Tables = { - new DatabaseTable(Database, "Blog") + new DatabaseTable { + Name = "Blog", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }, - new DatabaseTable(Database, "Posts") + new DatabaseTable { + Name = "Posts", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey } @@ -990,24 +1079,33 @@ public void Pluralization_of_entity_and_DbSet() [ConditionalFact] public void Pluralization_of_collection_navigations() { - var blogTable = new DatabaseTable(Database, "Blog") + var blogTable = new DatabaseTable { + Name = "Blog", Columns = { IdColumn }, PrimaryKey = IdPrimaryKey }; - var postTable = new DatabaseTable(Database, "Post") + var postTable = new DatabaseTable { + Name = "Post", Columns = { IdColumn, - new DatabaseColumn(Table, "BlogId", "int") { IsNullable = true } + new DatabaseColumn + { + Name = "BlogId", + StoreType = "int", + IsNullable = true + } }, PrimaryKey = IdPrimaryKey }; postTable.ForeignKeys.Add( - new DatabaseForeignKey(postTable, "FK_Foo", blogTable) + new DatabaseForeignKey { + Table = postTable, + PrincipalTable = blogTable, OnDelete = ReferentialAction.Cascade, Columns = { postTable.Columns.ElementAt(1) }, PrincipalColumns = { blogTable.Columns.ElementAt(0) } @@ -1049,18 +1147,23 @@ public void Not_null_bool_column_with_default_value_is_made_nullable() { Tables = { - new DatabaseTable(Database, "Table") + new DatabaseTable { + Name = "Table", Columns = { IdColumn, - new DatabaseColumn(Table, "NonNullBoolWithDefault", "bit") + new DatabaseColumn { + Name = "NonNullBoolWithDefault", + StoreType = "bit", DefaultValueSql = "Default", IsNullable = false }, - new DatabaseColumn(Table, "NonNullBoolWithoutDefault", "bit") + new DatabaseColumn { + Name = "NonNullBoolWithoutDefault", + StoreType = "bit", IsNullable = false } }, @@ -1087,13 +1190,16 @@ public void Nullable_column_with_default_value_sql_does_not_generate_warning() { Tables = { - new DatabaseTable(Database, "Table") + new DatabaseTable { + Name = "Table", Columns = { IdColumn, - new DatabaseColumn(Table, "NullBoolWithDefault", "bit") + new DatabaseColumn { + Name = "NullBoolWithDefault", + StoreType = "bit", DefaultValueSql = "Default", IsNullable = true } @@ -1117,17 +1223,20 @@ public void Nullable_column_with_default_value_sql_does_not_generate_warning() [ConditionalFact] public void Correct_arguments_to_scaffolding_typemapper() { - var principalPkColumn = new DatabaseColumn(Table, "PrimaryKey", "nvarchar(450)"); - var principalAkColumn = new DatabaseColumn(Table, "AlternateKey", "nvarchar(450)"); - var principalIndexColumn = new DatabaseColumn(Table, "Index", "nvarchar(450)"); - var rowversionColumn = new DatabaseColumn(Table, "Rowversion", "rowversion") + var principalPkColumn = new DatabaseColumn { Name = "PrimaryKey", StoreType = "nvarchar(450)" }; + var principalAkColumn = new DatabaseColumn { Name = "AlternateKey", StoreType = "nvarchar(450)" }; + var principalIndexColumn = new DatabaseColumn { Name = "Index", StoreType = "nvarchar(450)" }; + var rowversionColumn = new DatabaseColumn { + Name = "Rowversion", + StoreType = "rowversion", ValueGenerated = ValueGenerated.OnAddOrUpdate, [ScaffoldingAnnotationNames.ConcurrencyToken] = true }; - var principalTable = new DatabaseTable(Database, "Principal") + var principalTable = new DatabaseTable { + Name = "Principal", Columns = { principalPkColumn, @@ -1135,24 +1244,26 @@ public void Correct_arguments_to_scaffolding_typemapper() principalIndexColumn, rowversionColumn }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { principalPkColumn } }, - UniqueConstraints = { new DatabaseUniqueConstraint(Table, "AK_Foo") { Columns = { principalAkColumn } } }, - Indexes = { new DatabaseIndex(Table, "IX_Foo") { Columns = { principalIndexColumn } } } + PrimaryKey = new DatabasePrimaryKey { Columns = { principalPkColumn } }, + UniqueConstraints = { new DatabaseUniqueConstraint { Columns = { principalAkColumn } } }, + Indexes = { new DatabaseIndex { Columns = { principalIndexColumn } } } }; - var dependentIdColumn = new DatabaseColumn(Table, "Id", "int"); - var dependentFkColumn = new DatabaseColumn(Table, "BlogAlternateKey", "nvarchar(450)"); + var dependentIdColumn = new DatabaseColumn { Name = "Id", StoreType = "int" }; + var dependentFkColumn = new DatabaseColumn { Name = "BlogAlternateKey", StoreType = "nvarchar(450)" }; - var dependentTable = new DatabaseTable(Database, "Dependent") + var dependentTable = new DatabaseTable { + Name = "Dependent", Columns = { dependentIdColumn, dependentFkColumn }, - PrimaryKey = new DatabasePrimaryKey(Table, "PK_Foo") { Columns = { dependentIdColumn } }, - Indexes = { new DatabaseIndex(Table, "IX_Foo") { Columns = { dependentFkColumn } } }, + PrimaryKey = new DatabasePrimaryKey { Columns = { dependentIdColumn } }, + Indexes = { new DatabaseIndex { Columns = { dependentFkColumn } } }, ForeignKeys = { - new DatabaseForeignKey(Table, "FK_Foo", principalTable) + new DatabaseForeignKey { Columns = { dependentFkColumn }, + PrincipalTable = principalTable, PrincipalColumns = { principalAkColumn } } } @@ -1172,14 +1283,15 @@ public void Correct_arguments_to_scaffolding_typemapper() [ConditionalFact] public void Unmapped_column_is_ignored() { - var columnWithUnknownType = new DatabaseColumn(Table, "ColumnWithUnknownStoreType", "unknown_type"); + var columnWithUnknownType = new DatabaseColumn { Name = "ColumnWithUnknownStoreType", StoreType = "unknown_type" }; var dbModel = new DatabaseModel { Tables = { - new DatabaseTable(Database, "Table") + new DatabaseTable { + Name = "Table", Columns = { IdColumn, columnWithUnknownType }, PrimaryKey = IdPrimaryKey } @@ -1200,13 +1312,19 @@ public void Column_and_table_comments() { Tables = { - new DatabaseTable(Database, "Table") + new DatabaseTable { + Name = "Table", Comment = "A table", Columns = { IdColumn, - new DatabaseColumn(Table, "Column", "int") { Comment = "An int column" } + new DatabaseColumn + { + Name = "Column", + StoreType = "int", + Comment = "An int column" + } } } } diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/ReverseEngineerScaffolderTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/ReverseEngineerScaffolderTest.cs index 307a7d11425..547ab17af6a 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/ReverseEngineerScaffolderTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/ReverseEngineerScaffolderTest.cs @@ -24,9 +24,10 @@ public void Save_works() { using var directory = new TempDirectory(); var scaffolder = CreateScaffolder(); - var scaffoldedModel = new ScaffoldedModel(new ScaffoldedFile(Path.Combine("..", "Data", "TestContext.cs"), "// TestContext")) + var scaffoldedModel = new ScaffoldedModel { - AdditionalFiles = { new ScaffoldedFile("TestEntity.cs", "// TestEntity") } + ContextFile = new ScaffoldedFile { Path = Path.Combine("..", "Data", "TestContext.cs"), Code = "// TestContext" }, + AdditionalFiles = { new ScaffoldedFile { Path = "TestEntity.cs", Code = "// TestEntity" } } }; var result = scaffolder.Save( @@ -55,9 +56,10 @@ public void Save_throws_when_existing_files() File.WriteAllText(entityTypePath, "// Old"); var scaffolder = CreateScaffolder(); - var scaffoldedModel = new ScaffoldedModel(new ScaffoldedFile("TestContext.cs", "// TestContext")) + var scaffoldedModel = new ScaffoldedModel { - AdditionalFiles = { new ScaffoldedFile("TestEntity.cs", "// TestEntity") } + ContextFile = new ScaffoldedFile { Path = "TestContext.cs", Code = "// TestContext" }, + AdditionalFiles = { new ScaffoldedFile { Path = "TestEntity.cs", Code = "// TestEntity" } } }; var ex = Assert.Throws( @@ -78,7 +80,7 @@ public void Save_works_when_overwriteFiles() File.WriteAllText(path, "// Old"); var scaffolder = CreateScaffolder(); - var scaffoldedModel = new ScaffoldedModel(new ScaffoldedFile("Test.cs", "// Test")); + var scaffoldedModel = new ScaffoldedModel { ContextFile = new ScaffoldedFile { Path = "Test.cs", Code = "// Test" } }; var result = scaffolder.Save(scaffoldedModel, directory.Path, overwriteFiles: true); @@ -102,9 +104,10 @@ public void Save_throws_when_readonly_files() try { var scaffolder = CreateScaffolder(); - var scaffoldedModel = new ScaffoldedModel(new ScaffoldedFile("TestContext.cs", "// TestContext")) + var scaffoldedModel = new ScaffoldedModel { - AdditionalFiles = { new ScaffoldedFile("TestEntity.cs", "// TestEntity") } + ContextFile = new ScaffoldedFile { Path = "TestContext.cs", Code = "// TestContext" }, + AdditionalFiles = { new ScaffoldedFile { Path = "TestEntity.cs", Code = "// TestEntity" } } }; var ex = Assert.Throws( @@ -155,10 +158,7 @@ public void ScaffoldModel_works_with_named_connection_string() "Name=DefaultConnection", new DatabaseModelFactoryOptions(), new ModelReverseEngineerOptions(), - new ModelCodeGenerationOptions - { - ModelNamespace = "Foo" - }); + new ModelCodeGenerationOptions()); Assert.Equal("Data Source=Test", databaseModelFactory.ConnectionString);