Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -101,20 +101,34 @@ protected virtual void ValidateVectorColumns(
IModel model,
IDiagnosticsLogger<DbLoggerCategory.Model.Validation> logger)
{
foreach (IConventionProperty property in model.GetEntityTypes()
.SelectMany(t => t.GetDeclaredProperties())
.Where(p => p.ClrType.UnwrapNullableType() == typeof(SqlVector<float>)))
foreach (var entityType in model.GetEntityTypes())
{
if (property.GetTypeMapping() is not SqlServerVectorTypeMapping { Size: not null } vectorTypeMapping)
ValidateVectorColumns(entityType);
}

void ValidateVectorColumns(ITypeBase typeBase)
{
foreach (var property in typeBase.GetDeclaredProperties())
{
throw new InvalidOperationException(
SqlServerStrings.VectorDimensionsMissing(property.DeclaringType.DisplayName(), property.Name));
if (property.FindTypeMapping() is SqlServerVectorTypeMapping vectorTypeMapping)
{
if (property.DeclaringType.IsMappedToJson())
{
throw new InvalidOperationException(
SqlServerStrings.VectorPropertiesNotSupportedInJson(property.DeclaringType.DisplayName(), property.Name));
}

if (vectorTypeMapping.Size is null)
{
throw new InvalidOperationException(
SqlServerStrings.VectorDimensionsMissing(property.DeclaringType.DisplayName(), property.Name));
}
}
}

if (property.DeclaringType.IsMappedToJson())
foreach (var complexProperty in typeBase.GetDeclaredComplexProperties())
{
throw new InvalidOperationException(
SqlServerStrings.VectorPropertiesNotSupportedInJson(property.DeclaringType.DisplayName(), property.Name));
ValidateVectorColumns(complexProperty.ComplexType);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1105,7 +1105,7 @@ public virtual void Throws_for_vector_property_without_dimensions()
}

[ConditionalFact]
public virtual void Throws_for_vector_property_inside_JSON()
public virtual void Throws_for_vector_property_inside_JSON_owned_entity()
{
var modelBuilder = CreateConventionModelBuilder();

Expand All @@ -1121,6 +1121,27 @@ public virtual void Throws_for_vector_property_inside_JSON()
modelBuilder);
}

[ConditionalFact]
public virtual void Throws_for_vector_property_inside_JSON_complex_type()
{
var modelBuilder = CreateConventionModelBuilder();

modelBuilder.Entity<VectorInsideJsonEntity>()
.ComplexProperty(
v => v.VectorContainer,
n =>
{
n.ToJson();
n.Property(v => v.Vector).HasMaxLength(3);
});

VerifyError(
SqlServerStrings.VectorPropertiesNotSupportedInJson(
"VectorInsideJsonEntity.VectorContainer#VectorContainer",
nameof(VectorContainer.Vector)),
modelBuilder);
}

public class VectorWithoutDimensionsEntity
{
public int Id { get; set; }
Expand Down