@@ -10770,6 +10770,337 @@ CONSTRAINT [PK_HistoryTable] PRIMARY KEY ([Id])
1077010770""" ) ;
1077110771 }
1077210772
10773+ [ ConditionalFact ]
10774+ public virtual async Task Add_required_primitve_collection_to_existing_table ( )
10775+ {
10776+ await Test (
10777+ builder => builder . Entity (
10778+ "Customer" , e =>
10779+ {
10780+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10781+ e . HasKey ( "Id" ) ;
10782+ e . Property < string > ( "Name" ) ;
10783+ e . ToTable ( "Customers" ) ;
10784+ } ) ,
10785+ builder => builder . Entity (
10786+ "Customer" , e =>
10787+ {
10788+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10789+ e . HasKey ( "Id" ) ;
10790+ e . Property < string > ( "Name" ) ;
10791+ e . Property < List < int > > ( "Numbers" ) . IsRequired ( ) ;
10792+ e . ToTable ( "Customers" ) ;
10793+ } ) ,
10794+ model =>
10795+ {
10796+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
10797+
10798+ Assert . Collection (
10799+ customersTable . Columns ,
10800+ c => Assert . Equal ( "Id" , c . Name ) ,
10801+ c => Assert . Equal ( "Name" , c . Name ) ,
10802+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
10803+ Assert . Same (
10804+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
10805+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
10806+ } ) ;
10807+
10808+ AssertSql (
10809+ """
10810+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'[]';
10811+ """ ) ;
10812+ }
10813+
10814+ [ ConditionalFact ]
10815+ public virtual async Task Add_required_primitve_collection_with_custom_default_value_to_existing_table ( )
10816+ {
10817+ await Test (
10818+ builder => builder . Entity (
10819+ "Customer" , e =>
10820+ {
10821+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10822+ e . HasKey ( "Id" ) ;
10823+ e . Property < string > ( "Name" ) ;
10824+ e . ToTable ( "Customers" ) ;
10825+ } ) ,
10826+ builder => builder . Entity (
10827+ "Customer" , e =>
10828+ {
10829+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10830+ e . HasKey ( "Id" ) ;
10831+ e . Property < string > ( "Name" ) ;
10832+ e . Property < List < int > > ( "Numbers" ) . IsRequired ( ) . HasDefaultValue ( new List < int > { 1 , 2 , 3 } ) ;
10833+ e . ToTable ( "Customers" ) ;
10834+ } ) ,
10835+ model =>
10836+ {
10837+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
10838+
10839+ Assert . Collection (
10840+ customersTable . Columns ,
10841+ c => Assert . Equal ( "Id" , c . Name ) ,
10842+ c => Assert . Equal ( "Name" , c . Name ) ,
10843+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
10844+ Assert . Same (
10845+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
10846+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
10847+ } ) ;
10848+
10849+ AssertSql (
10850+ """
10851+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'[1,2,3]';
10852+ """ ) ;
10853+ }
10854+
10855+ [ ConditionalFact ]
10856+ public virtual async Task Add_required_primitve_collection_with_custom_default_value_sql_to_existing_table ( )
10857+ {
10858+ await Test (
10859+ builder => builder . Entity (
10860+ "Customer" , e =>
10861+ {
10862+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10863+ e . HasKey ( "Id" ) ;
10864+ e . Property < string > ( "Name" ) ;
10865+ e . ToTable ( "Customers" ) ;
10866+ } ) ,
10867+ builder => builder . Entity (
10868+ "Customer" , e =>
10869+ {
10870+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10871+ e . HasKey ( "Id" ) ;
10872+ e . Property < string > ( "Name" ) ;
10873+ e . Property < List < int > > ( "Numbers" ) . IsRequired ( ) . HasDefaultValueSql ( "N'[3, 2, 1]'" ) ;
10874+ e . ToTable ( "Customers" ) ;
10875+ } ) ,
10876+ model =>
10877+ {
10878+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
10879+
10880+ Assert . Collection (
10881+ customersTable . Columns ,
10882+ c => Assert . Equal ( "Id" , c . Name ) ,
10883+ c => Assert . Equal ( "Name" , c . Name ) ,
10884+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
10885+ Assert . Same (
10886+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
10887+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
10888+ } ) ;
10889+
10890+ AssertSql (
10891+ """
10892+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT (N'[3, 2, 1]');
10893+ """ ) ;
10894+ }
10895+
10896+ [ ConditionalFact ( Skip = "issue #33038" ) ]
10897+ public virtual async Task Add_required_primitve_collection_with_custom_converter_to_existing_table ( )
10898+ {
10899+ await Test (
10900+ builder => builder . Entity (
10901+ "Customer" , e =>
10902+ {
10903+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10904+ e . HasKey ( "Id" ) ;
10905+ e . Property < string > ( "Name" ) ;
10906+ e . ToTable ( "Customers" ) ;
10907+ } ) ,
10908+ builder => builder . Entity (
10909+ "Customer" , e =>
10910+ {
10911+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10912+ e . HasKey ( "Id" ) ;
10913+ e . Property < string > ( "Name" ) ;
10914+ e . Property < List < int > > ( "Numbers" ) . HasConversion ( new ValueConverter < List < int > , string > (
10915+ convertToProviderExpression : x => x != null && x . Count > 0 ? "some numbers" : "nothing" ,
10916+ convertFromProviderExpression : x => x == "nothing" ? new List < int > { } : new List < int > { 7 , 8 , 9 } ) )
10917+ . IsRequired ( ) ;
10918+ e . ToTable ( "Customers" ) ;
10919+ } ) ,
10920+ model =>
10921+ {
10922+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
10923+
10924+ Assert . Collection (
10925+ customersTable . Columns ,
10926+ c => Assert . Equal ( "Id" , c . Name ) ,
10927+ c => Assert . Equal ( "Name" , c . Name ) ,
10928+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
10929+ Assert . Same (
10930+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
10931+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
10932+ } ) ;
10933+
10934+ AssertSql (
10935+ """
10936+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'nothing';
10937+ """ ) ;
10938+ }
10939+
10940+ [ ConditionalFact ]
10941+ public virtual async Task Add_required_primitve_collection_with_custom_converter_and_custom_default_value_to_existing_table ( )
10942+ {
10943+ await Test (
10944+ builder => builder . Entity (
10945+ "Customer" , e =>
10946+ {
10947+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10948+ e . HasKey ( "Id" ) ;
10949+ e . Property < string > ( "Name" ) ;
10950+ e . ToTable ( "Customers" ) ;
10951+ } ) ,
10952+ builder => builder . Entity (
10953+ "Customer" , e =>
10954+ {
10955+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10956+ e . HasKey ( "Id" ) ;
10957+ e . Property < string > ( "Name" ) ;
10958+ e . Property < List < int > > ( "Numbers" ) . HasConversion ( new ValueConverter < List < int > , string > (
10959+ convertToProviderExpression : x => x != null && x . Count > 0 ? "some numbers" : "nothing" ,
10960+ convertFromProviderExpression : x => x == "nothing" ? new List < int > { } : new List < int > { 7 , 8 , 9 } ) )
10961+ . HasDefaultValue ( new List < int > { 42 } )
10962+ . IsRequired ( ) ;
10963+ e . ToTable ( "Customers" ) ;
10964+ } ) ,
10965+ model =>
10966+ {
10967+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
10968+
10969+ Assert . Collection (
10970+ customersTable . Columns ,
10971+ c => Assert . Equal ( "Id" , c . Name ) ,
10972+ c => Assert . Equal ( "Name" , c . Name ) ,
10973+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
10974+ Assert . Same (
10975+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
10976+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
10977+ } ) ;
10978+
10979+ AssertSql (
10980+ """
10981+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NOT NULL DEFAULT N'some numbers';
10982+ """ ) ;
10983+ }
10984+
10985+ [ ConditionalFact ]
10986+ public virtual async Task Add_optional_primitive_collection_to_existing_table ( )
10987+ {
10988+ await Test (
10989+ builder => builder . Entity (
10990+ "Customer" , e =>
10991+ {
10992+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
10993+ e . HasKey ( "Id" ) ;
10994+ e . Property < string > ( "Name" ) ;
10995+ e . ToTable ( "Customers" ) ;
10996+ } ) ,
10997+ builder => builder . Entity (
10998+ "Customer" , e =>
10999+ {
11000+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
11001+ e . HasKey ( "Id" ) ;
11002+ e . Property < string > ( "Name" ) ;
11003+ e . Property < List < int > > ( "Numbers" ) ;
11004+ e . ToTable ( "Customers" ) ;
11005+ } ) ,
11006+ model =>
11007+ {
11008+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
11009+
11010+ Assert . Collection (
11011+ customersTable . Columns ,
11012+ c => Assert . Equal ( "Id" , c . Name ) ,
11013+ c => Assert . Equal ( "Name" , c . Name ) ,
11014+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
11015+ Assert . Same (
11016+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
11017+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
11018+ } ) ;
11019+
11020+ AssertSql (
11021+ """
11022+ ALTER TABLE [Customers] ADD [Numbers] nvarchar(max) NULL;
11023+ """ ) ;
11024+ }
11025+
11026+ [ ConditionalFact ]
11027+ public virtual async Task Create_table_with_required_primitive_collection ( )
11028+ {
11029+ await Test (
11030+ builder => { } ,
11031+ builder => builder . Entity (
11032+ "Customer" , e =>
11033+ {
11034+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
11035+ e . HasKey ( "Id" ) ;
11036+ e . Property < string > ( "Name" ) ;
11037+ e . Property < List < int > > ( "Numbers" ) . IsRequired ( ) ;
11038+ e . ToTable ( "Customers" ) ;
11039+ } ) ,
11040+ model =>
11041+ {
11042+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
11043+
11044+ Assert . Collection (
11045+ customersTable . Columns ,
11046+ c => Assert . Equal ( "Id" , c . Name ) ,
11047+ c => Assert . Equal ( "Name" , c . Name ) ,
11048+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
11049+ Assert . Same (
11050+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
11051+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
11052+ } ) ;
11053+
11054+ AssertSql (
11055+ """
11056+ CREATE TABLE [Customers] (
11057+ [Id] int NOT NULL IDENTITY,
11058+ [Name] nvarchar(max) NULL,
11059+ [Numbers] nvarchar(max) NOT NULL,
11060+ CONSTRAINT [PK_Customers] PRIMARY KEY ([Id])
11061+ );
11062+ """ ) ;
11063+ }
11064+
11065+ [ ConditionalFact ]
11066+ public virtual async Task Create_table_with_optional_primitive_collection ( )
11067+ {
11068+ await Test (
11069+ builder => { } ,
11070+ builder => builder . Entity (
11071+ "Customer" , e =>
11072+ {
11073+ e . Property < int > ( "Id" ) . ValueGeneratedOnAdd ( ) ;
11074+ e . HasKey ( "Id" ) ;
11075+ e . Property < string > ( "Name" ) ;
11076+ e . Property < List < int > > ( "Numbers" ) ;
11077+ e . ToTable ( "Customers" ) ;
11078+ } ) ,
11079+ model =>
11080+ {
11081+ var customersTable = Assert . Single ( model . Tables . Where ( t => t . Name == "Customers" ) ) ;
11082+
11083+ Assert . Collection (
11084+ customersTable . Columns ,
11085+ c => Assert . Equal ( "Id" , c . Name ) ,
11086+ c => Assert . Equal ( "Name" , c . Name ) ,
11087+ c => Assert . Equal ( "Numbers" , c . Name ) ) ;
11088+ Assert . Same (
11089+ customersTable . Columns . Single ( c => c . Name == "Id" ) ,
11090+ Assert . Single ( customersTable . PrimaryKey ! . Columns ) ) ;
11091+ } ) ;
11092+
11093+ AssertSql (
11094+ """
11095+ CREATE TABLE [Customers] (
11096+ [Id] int NOT NULL IDENTITY,
11097+ [Name] nvarchar(max) NULL,
11098+ [Numbers] nvarchar(max) NULL,
11099+ CONSTRAINT [PK_Customers] PRIMARY KEY ([Id])
11100+ );
11101+ """ ) ;
11102+ }
11103+
1077311104 protected override string NonDefaultCollation
1077411105 => _nonDefaultCollation ??= GetDatabaseCollation ( ) == "German_PhoneBook_CI_AS"
1077511106 ? "French_CI_AS"
0 commit comments