@@ -59,7 +59,6 @@ public static string CreateTable(MetaObject entity, MetaRoot root)
5959 {
6060 var table = entity . DbTable ?? entity . Name ;
6161 var pk = entity . PrimaryIdentity ( ) ;
62- var pkCols = ( pk ? . Fields ?? [ ] ) . ToHashSet ( StringComparer . Ordinal ) ;
6362
6463 var lines = new List < string > ( ) ;
6564 foreach ( var f in entity . Fields ( ) )
@@ -76,7 +75,8 @@ public static string CreateTable(MetaObject entity, MetaRoot root)
7675 }
7776 if ( pk is not null && pk . Fields . Count > 0 )
7877 {
79- var cols = entity . Fields ( ) . Where ( f => pkCols . Contains ( f . Name ) ) . Select ( Col ) ;
78+ // Preserve the identity's declared @fields order (not field-declaration order).
79+ var cols = pk . Fields . Select ( name => ResolveColumn ( entity , name ) ) ;
8080 lines . Add ( $ " PRIMARY KEY ({ string . Join ( ", " , cols ) } )") ;
8181 }
8282 // FOREIGN KEY constraints from enforced identity.reference children.
@@ -93,7 +93,7 @@ public static string CreateTable(MetaObject entity, MetaRoot root)
9393 // UNIQUE indexes from secondary identities marked unique.
9494 foreach ( var sec in entity . SecondaryIdentities ( ) . Where ( i => i . Unique ) )
9595 {
96- var cols = entity . Fields ( ) . Where ( f => sec . Fields . Contains ( f . Name ) ) . Select ( Col ) ;
96+ var cols = sec . Fields . Select ( name => ResolveColumn ( entity , name ) ) ;
9797 sb . AppendLine ( $ "CREATE UNIQUE INDEX { table } _{ sec . Name } _uniq ON { table } ({ string . Join ( ", " , cols ) } );") ;
9898 }
9999 return sb . ToString ( ) ;
@@ -106,7 +106,7 @@ public static string CreateTable(MetaObject entity, MetaRoot root)
106106 private static IEnumerable < string > ObjectFieldColumns ( MetaObject entity , MetaField f , MetaRoot root )
107107 {
108108 if ( f . Storage == STORAGE_FLATTENED && f . ObjectRef is { } oref &&
109- root . FindObject ( StripPkg ( oref ) ) is { } nested )
109+ root . FindObject ( CSharpNaming . StripPkg ( oref ) ) is { } nested )
110110 {
111111 var prefix = Col ( f ) + "_" ;
112112 foreach ( var nf in nested . Fields ( ) . Where ( n => CSharpNaming . ScalarFor ( n . SubType ) is not null ) )
@@ -127,7 +127,7 @@ private static IEnumerable<string> ObjectFieldColumns(MetaObject entity, MetaFie
127127 private static string ? ForeignKeyClause ( MetaObject entity , MetaReferenceIdentity fk , MetaRoot root )
128128 {
129129 if ( fk . TargetEntity is not { } targetName || fk . Fields . Count == 0 ) return null ;
130- var target = root . FindObject ( StripPkg ( targetName ) ) ;
130+ var target = root . FindObject ( CSharpNaming . StripPkg ( targetName ) ) ;
131131 if ( target is null ) return null ;
132132
133133 var fkCols = fk . Fields . Select ( js => ResolveColumn ( entity , js ) ) . ToList ( ) ;
@@ -173,17 +173,17 @@ public static string CreateView(MetaObject projection, MetaRoot root, Action<str
173173 if ( origin is MetaPassthroughOrigin pt && pt . Via is null && pt . From is { } from && from . Contains ( '.' ) )
174174 {
175175 var ( ent , field ) = SplitDot ( from ) ;
176- baseEntity ??= StripPkg ( ent ) ;
177- if ( StripPkg ( ent ) != baseEntity ) { blocked = "passthrough from multiple base entities" ; break ; }
176+ baseEntity ??= CSharpNaming . StripPkg ( ent ) ;
177+ if ( CSharpNaming . StripPkg ( ent ) != baseEntity ) { blocked = "passthrough from multiple base entities" ; break ; }
178178 cols . Add ( $ " { ResolveColumn ( root . FindObject ( baseEntity ) , field ) } AS { Col ( f ) } ") ;
179179 }
180180 // passthrough WITH via → forward a field from a to-one related entity (correlated subquery).
181181 else if ( origin is MetaPassthroughOrigin ptv && ptv . Via is { } pvia && ptv . From is { } pfrom &&
182182 pvia . Contains ( '.' ) && pfrom . Contains ( '.' ) )
183183 {
184184 var ( baseEnt , relName ) = SplitDot ( pvia ) ;
185- baseEntity ??= StripPkg ( baseEnt ) ;
186- if ( StripPkg ( baseEnt ) != baseEntity ) { blocked = "passthrough via a different base entity" ; break ; }
185+ baseEntity ??= CSharpNaming . StripPkg ( baseEnt ) ;
186+ if ( CSharpNaming . StripPkg ( baseEnt ) != baseEntity ) { blocked = "passthrough via a different base entity" ; break ; }
187187 if ( ToOneFk ( root , baseEntity , relName ) is not { } fk )
188188 { blocked = $ "unresolved to-one FK for @via \" { pvia } \" (base needs an identity.reference)"; break ; }
189189 var srcCol = ResolveColumn ( fk . Target , SplitDot ( pfrom ) . Tail ) ;
@@ -194,8 +194,8 @@ public static string CreateView(MetaObject projection, MetaRoot root, Action<str
194194 of . Contains ( '.' ) && via . Contains ( '.' ) )
195195 {
196196 var ( baseEnt , relName ) = SplitDot ( via ) ;
197- baseEntity ??= StripPkg ( baseEnt ) ;
198- if ( StripPkg ( baseEnt ) != baseEntity ) { blocked = "aggregate over a different base entity" ; break ; }
197+ baseEntity ??= CSharpNaming . StripPkg ( baseEnt ) ;
198+ if ( CSharpNaming . StripPkg ( baseEnt ) != baseEntity ) { blocked = "aggregate over a different base entity" ; break ; }
199199 if ( ToManyFk ( root , baseEntity , relName ) is not { } fk )
200200 { blocked = $ "unresolved to-many FK for @via \" { via } \" (target needs an identity.reference back to { baseEntity } )"; break ; }
201201 var ofCol = ResolveColumn ( fk . Target , SplitDot ( of ) . Tail ) ;
@@ -205,9 +205,9 @@ public static string CreateView(MetaObject projection, MetaRoot root, Action<str
205205 else if ( origin is MetaCollectionOrigin coll && coll . Via is { } cvia && cvia . Contains ( '.' ) && f . ObjectRef is { } objRef )
206206 {
207207 var ( baseEnt , relName ) = SplitDot ( cvia ) ;
208- baseEntity ??= StripPkg ( baseEnt ) ;
209- if ( StripPkg ( baseEnt ) != baseEntity ) { blocked = "collection over a different base entity" ; break ; }
210- var nested = root . FindObject ( StripPkg ( objRef ) ) ;
208+ baseEntity ??= CSharpNaming . StripPkg ( baseEnt ) ;
209+ if ( CSharpNaming . StripPkg ( baseEnt ) != baseEntity ) { blocked = "collection over a different base entity" ; break ; }
210+ var nested = root . FindObject ( CSharpNaming . StripPkg ( objRef ) ) ;
211211 if ( ToManyFk ( root , baseEntity , relName ) is not { } fk || nested is null )
212212 { blocked = $ "unresolved collection @via \" { cvia } \" / @objectRef \" { objRef } \" "; break ; }
213213 var pairs = nested . Fields ( )
@@ -238,29 +238,31 @@ private static (string Head, string Tail) SplitDot(string s)
238238 return ( s [ ..i ] , s [ ( i + 1 ) ..] ) ;
239239 }
240240
241- private static string StripPkg ( string s )
242- {
243- var i = s . LastIndexOf ( "::" , StringComparison . Ordinal ) ;
244- return i < 0 ? s : s [ ( i + 2 ) ..] ;
245- }
246-
247241 private static string ResolveColumn ( MetaObject ? obj , string fieldName ) =>
248242 obj ? . Fields ( ) . FirstOrDefault ( f => f . Name == fieldName ) ? . DbColumn ?? fieldName ;
249243
244+ // Resolve a named relationship on the base entity to its (base, target) objects.
245+ private static ( MetaObject Base , MetaObject Target ) ? ResolveRelation (
246+ MetaRoot root , string baseEntity , string relName )
247+ {
248+ var baseObj = root . FindObject ( baseEntity ) ;
249+ var rel = baseObj ? . Relationships ( ) . FirstOrDefault ( r => r . Name == relName ) ;
250+ if ( baseObj is null || rel ? . ObjectRef is not { } objRef ) return null ;
251+ var target = root . FindObject ( CSharpNaming . StripPkg ( objRef ) ) ;
252+ return target is null ? null : ( baseObj , target ) ;
253+ }
254+
250255 // Resolve a to-many relationship to the FK that lives on the *target* entity:
251256 // the target carries an identity.reference back to the base. Used by aggregate
252257 // and collection origins (subquery scans the target, filtered by the base PK).
253258 private static ( MetaObject Target , string TargetTable , string FkCol , string ParentCol ) ? ToManyFk (
254259 MetaRoot root , string baseEntity , string relName )
255260 {
256- var baseObj = root . FindObject ( baseEntity ) ;
257- var rel = baseObj ? . Relationships ( ) . FirstOrDefault ( r => r . Name == relName ) ;
258- if ( baseObj is null || rel ? . ObjectRef is not { } objRef ) return null ;
259- var target = root . FindObject ( StripPkg ( objRef ) ) ;
260- if ( target is null ) return null ;
261+ if ( ResolveRelation ( root , baseEntity , relName ) is not { } rel ) return null ;
262+ var ( baseObj , target ) = rel ;
261263
262264 var fkRef = target . ReferenceIdentities ( )
263- . FirstOrDefault ( r => r . TargetEntity is { } te && StripPkg ( te ) == baseEntity ) ;
265+ . FirstOrDefault ( r => r . TargetEntity is { } te && CSharpNaming . StripPkg ( te ) == baseEntity ) ;
264266 if ( fkRef is null || fkRef . Fields . Count == 0 ) return null ;
265267
266268 var fkCol = ResolveColumn ( target , fkRef . Fields [ 0 ] ) ;
@@ -278,14 +280,11 @@ private static (MetaObject Target, string TargetTable, string FkCol, string Pare
278280 private static ( MetaObject Target , string TargetTable , string TargetKeyCol , string BaseFkCol ) ? ToOneFk (
279281 MetaRoot root , string baseEntity , string relName )
280282 {
281- var baseObj = root . FindObject ( baseEntity ) ;
282- var rel = baseObj ? . Relationships ( ) . FirstOrDefault ( r => r . Name == relName ) ;
283- if ( baseObj is null || rel ? . ObjectRef is not { } objRef ) return null ;
284- var target = root . FindObject ( StripPkg ( objRef ) ) ;
285- if ( target is null ) return null ;
283+ if ( ResolveRelation ( root , baseEntity , relName ) is not { } rel ) return null ;
284+ var ( baseObj , target ) = rel ;
286285
287286 var fkRef = baseObj . ReferenceIdentities ( )
288- . FirstOrDefault ( r => r . TargetEntity is { } te && StripPkg ( te ) == StripPkg ( objRef ) ) ;
287+ . FirstOrDefault ( r => r . TargetEntity is { } te && CSharpNaming . StripPkg ( te ) == target . Name ) ;
289288 if ( fkRef is null || fkRef . Fields . Count == 0 ) return null ;
290289
291290 var baseFkCol = ResolveColumn ( baseObj , fkRef . Fields [ 0 ] ) ;
0 commit comments