Skip to content

Commit 8b8892e

Browse files
committed
Cleanup CosmosJsonIdConvention
1 parent b8ddc5b commit 8b8892e

3 files changed

Lines changed: 70 additions & 35 deletions

File tree

src/EFCore.Cosmos/Metadata/Conventions/CosmosJsonIdConvention.cs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,10 @@ private void ProcessEntityType(IConventionEntityType entityType, IConventionCont
7676
var computedIdProperty = entityType.FindDeclaredProperty(DefaultIdPropertyName);
7777

7878
var primaryKey = entityType.FindPrimaryKey();
79-
if (entityType.BaseType != null // Requires: IEntityTypeBaseTypeChangedConvention
80-
|| !entityType.IsDocumentRoot() // Requires: IEntityTypeAnnotationChangedConvention (ContainerName)
81-
|| entityType.GetForeignKeys()
82-
.Any(fk => fk.IsOwnership) // Requires: IForeignKeyOwnershipChangedConvention, IForeignKeyRemovedConvention
83-
|| primaryKey == null) // Requires: IKeyAddedConvention, IKeyRemovedConvention
79+
if (entityType.BaseType != null
80+
|| !entityType.IsDocumentRoot()
81+
|| entityType.GetForeignKeys().Any(fk => fk.IsOwnership)
82+
|| primaryKey == null)
8483
{
8584
// If the entity type is not a keyed, root document in the container, then it doesn't have an `id` mapping, so
8685
// undo anything that was done by previous execution of this convention.
@@ -93,7 +92,8 @@ private void ProcessEntityType(IConventionEntityType entityType, IConventionCont
9392
if (computedIdProperty is not null
9493
&& computedIdProperty != jsonIdProperty)
9594
{
96-
entityType.Builder.RemoveUnusedImplicitProperties([computedIdProperty]); }
95+
entityType.Builder.RemoveUnusedImplicitProperties([computedIdProperty]);
96+
}
9797

9898
return;
9999
}
@@ -102,17 +102,9 @@ private void ProcessEntityType(IConventionEntityType entityType, IConventionCont
102102
// key is represented by a single string property, and the discriminator is not being included in the JSON `id`.
103103
// If these conditions are not met, or if the user has opted-in, then we will create a computed property that transforms
104104
// the appropriate values into a single string for the JSON `id` property.
105-
106-
// The line below requires: IModelAnnotationChangedConvention, IPropertyAnnotationChangedConvention
107105
var alwaysCreateId = entityType.GetHasShadowId();
108106
if (alwaysCreateId != true)
109107
{
110-
// The line below requires:
111-
// - IModelAnnotationChangedConvention, IPropertyAnnotationChangedConvention
112-
// - IKeyAddedConvention, IKeyRemovedConvention
113-
// - IPropertyAddedConvention, IPropertyRemovedConvention
114-
// - IDiscriminatorPropertySetConvention
115-
// - IEntityTypeBaseTypeChangedConvention
116108
var idDefinition = DefinitionFactory.Create((IEntityType)entityType)!;
117109
if (idDefinition is { IncludesDiscriminator: false, Properties.Count: 1 })
118110
{
@@ -183,13 +175,10 @@ private void ProcessEntityType(IConventionEntityType entityType, IConventionCont
183175
return;
184176
}
185177

186-
if (computedIdPropertyBuilder.Metadata.GetJsonPropertyName() != IdPropertyJsonName)
187-
{
188-
computedIdPropertyBuilder = computedIdPropertyBuilder.ToJsonProperty(IdPropertyJsonName)
189-
?? computedIdPropertyBuilder;
190-
}
191-
192178
// Don't chain, because each of these could return null if the property has been explicitly configured with some other value.
179+
computedIdPropertyBuilder = computedIdPropertyBuilder.ToJsonProperty(IdPropertyJsonName)
180+
?? computedIdPropertyBuilder;
181+
193182
computedIdPropertyBuilder = computedIdPropertyBuilder.IsRequired(true)
194183
?? computedIdPropertyBuilder;
195184

test/EFCore.Cosmos.FunctionalTests/ModelBuilding/CosmosModelBuilderGenericTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public virtual void Hierarchical_partition_key_is_added_to_the_alternate_key_if_
230230
{
231231
var modelBuilder = CreateModelBuilder();
232232

233-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
233+
modelBuilder.Entity<Customer>().HasShadowId();
234234
modelBuilder.Entity<Customer>().HasKey(CosmosJsonIdConvention.DefaultIdPropertyName);
235235

236236
modelBuilder.Entity<Customer>()
@@ -311,7 +311,7 @@ public virtual void No_alternate_key_is_created_if_primary_key_contains_id()
311311
{
312312
var modelBuilder = CreateModelBuilder();
313313

314-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
314+
modelBuilder.Entity<Customer>().HasShadowId();
315315
modelBuilder.Entity<Customer>().HasKey(CosmosJsonIdConvention.DefaultIdPropertyName);
316316

317317
modelBuilder.Entity<Customer>()
@@ -335,7 +335,7 @@ public virtual void No_alternate_key_is_created_if_primary_key_contains_id_and_p
335335
{
336336
var modelBuilder = CreateModelBuilder();
337337

338-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
338+
modelBuilder.Entity<Customer>().HasShadowId();
339339
modelBuilder.Entity<Customer>().HasKey(nameof(Customer.AlternateKey), CosmosJsonIdConvention.DefaultIdPropertyName);
340340

341341
modelBuilder.Entity<Customer>()
@@ -359,7 +359,7 @@ public virtual void No_alternate_key_is_created_if_primary_key_contains_id_and_h
359359
{
360360
var modelBuilder = CreateModelBuilder();
361361

362-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
362+
modelBuilder.Entity<Customer>().HasShadowId();
363363

364364
modelBuilder.Entity<Customer>().HasKey(
365365
nameof(Customer.AlternateKey),
@@ -404,7 +404,7 @@ public virtual void No_alternate_key_is_created_if_primary_key_contains_id_and_h
404404
{
405405
var modelBuilder = CreateModelBuilder();
406406

407-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
407+
modelBuilder.Entity<Customer>().HasShadowId();
408408

409409
modelBuilder.Entity<Customer>().HasKey(
410410
nameof(Customer.Title),
@@ -449,7 +449,7 @@ public virtual void Hierarchical_partition_key_is_added_to_the_alternate_key_if_
449449
{
450450
var modelBuilder = CreateModelBuilder();
451451

452-
modelBuilder.Entity<Customer>().AlwaysHasShadowId();
452+
modelBuilder.Entity<Customer>().HasShadowId();
453453

454454
modelBuilder.Entity<Customer>().HasKey(
455455
nameof(Customer.Title),

test/EFCore.Cosmos.FunctionalTests/ModelBuilding/CosmosTestModelBuilderExtensions.cs

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,49 @@ namespace Microsoft.EntityFrameworkCore.ModelBuilding;
77

88
public static class CosmosTestModelBuilderExtensions
99
{
10-
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> HasPartitionKey<TEntity, TProperty>(
10+
public static ModelBuilderTest.TestModelBuilder HasShadowIds(
11+
this ModelBuilderTest.TestModelBuilder builder,
12+
bool? alwaysCreate = true)
13+
{
14+
if (builder is IInfrastructure<ModelBuilder> nonGenericBuilder)
15+
{
16+
nonGenericBuilder.Instance.HasShadowIds(alwaysCreate);
17+
}
18+
19+
return builder;
20+
}
21+
22+
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> HasShadowId<TEntity>(
1123
this ModelBuilderTest.TestEntityTypeBuilder<TEntity> builder,
12-
Expression<Func<TEntity, TProperty>> propertyExpression)
24+
bool? alwaysCreate = true)
1325
where TEntity : class
1426
{
1527
switch (builder)
1628
{
1729
case IInfrastructure<EntityTypeBuilder<TEntity>> genericBuilder:
18-
genericBuilder.Instance.HasPartitionKey(propertyExpression);
30+
genericBuilder.Instance.HasShadowId(alwaysCreate);
1931
break;
2032
case IInfrastructure<EntityTypeBuilder> nonGenericBuilder:
21-
var names = propertyExpression.GetMemberAccessList().Select(e => e.GetSimpleMemberName()).ToList();
22-
nonGenericBuilder.Instance.HasPartitionKey(names.FirstOrDefault(), names.Count > 1 ? names.Skip(1).ToArray() : []);
33+
nonGenericBuilder.Instance.HasShadowId(alwaysCreate);
2334
break;
2435
}
2536

2637
return builder;
2738
}
2839

29-
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> AlwaysHasShadowId<TEntity>(
40+
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> HasPartitionKey<TEntity, TProperty>(
3041
this ModelBuilderTest.TestEntityTypeBuilder<TEntity> builder,
31-
bool? alwaysCreate = true)
42+
Expression<Func<TEntity, TProperty>> propertyExpression)
3243
where TEntity : class
3344
{
3445
switch (builder)
3546
{
3647
case IInfrastructure<EntityTypeBuilder<TEntity>> genericBuilder:
37-
genericBuilder.Instance.HasShadowId(alwaysCreate);
48+
genericBuilder.Instance.HasPartitionKey(propertyExpression);
3849
break;
3950
case IInfrastructure<EntityTypeBuilder> nonGenericBuilder:
40-
nonGenericBuilder.Instance.HasShadowId(alwaysCreate);
51+
var names = propertyExpression.GetMemberAccessList().Select(e => e.GetSimpleMemberName()).ToList();
52+
nonGenericBuilder.Instance.HasPartitionKey(names.FirstOrDefault(), names.Count > 1 ? names.Skip(1).ToArray() : []);
4153
break;
4254
}
4355

@@ -63,6 +75,40 @@ public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> HasPartitionKey<TE
6375
return builder;
6476
}
6577

78+
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> ToContainer<TEntity>(
79+
this ModelBuilderTest.TestEntityTypeBuilder<TEntity> builder,
80+
string name)
81+
where TEntity : class
82+
{
83+
switch (builder)
84+
{
85+
case IInfrastructure<EntityTypeBuilder<TEntity>> genericBuilder:
86+
genericBuilder.Instance.ToContainer(name);
87+
break;
88+
case IInfrastructure<EntityTypeBuilder> nonGenericBuilder:
89+
nonGenericBuilder.Instance.ToContainer(name);
90+
break;
91+
}
92+
93+
return builder;
94+
}
95+
public static ModelBuilderTest.TestEntityTypeBuilder<TEntity> UseETagConcurrency<TEntity>(
96+
this ModelBuilderTest.TestEntityTypeBuilder<TEntity> builder)
97+
where TEntity : class
98+
{
99+
switch (builder)
100+
{
101+
case IInfrastructure<EntityTypeBuilder<TEntity>> genericBuilder:
102+
genericBuilder.Instance.UseETagConcurrency();
103+
break;
104+
case IInfrastructure<EntityTypeBuilder> nonGenericBuilder:
105+
nonGenericBuilder.Instance.UseETagConcurrency();
106+
break;
107+
}
108+
109+
return builder;
110+
}
111+
66112
public static ModelBuilderTest.TestPropertyBuilder<TProperty> ToJsonProperty<TProperty>(
67113
this ModelBuilderTest.TestPropertyBuilder<TProperty> builder,
68114
string name)

0 commit comments

Comments
 (0)