public async Task Should_use_ctor_of_value_types_instead_of_factory_because_EF_is_source_of_truth()
    {
        var entity = new TestEntity_with_Enum_and_ValueObjects
        {
            Id = new Guid("A53F60CD-B53E-40E3-B16F-05E9A223E238"),
            StringBasedReferenceValueObject  = StringBasedReferenceValueObject.Create("value"),
            StringBasedStructValueObject     = StringBasedStructValueObject.Create("other value"),
            TestSmartEnum_Struct_IntBased    = TestSmartEnum_Struct_IntBased.Value1,
            TestSmartEnum_Struct_StringBased = TestSmartEnum_Struct_StringBased.Value1,
            Boundary = Boundary.Create(10, 20)
        };

        _ctx.Add(entity);
        await _ctx.SaveChangesAsync();

        await using var command = _ctx.Database.GetDbConnection().CreateCommand();
        command.CommandText     = @"
UPDATE TestEntities_with_Enum_and_ValueObjects
SET
    StringBasedStructValueObject = '',
    Boundary_Lower = 30
";
        await command.ExecuteNonQueryAsync();

        _ctx.ChangeTracker.Clear();
        var loadedEntity = await _ctx.TestEntities_with_Enum_and_ValueObjects.SingleAsync();

        loadedEntity.StringBasedStructValueObject.Property.Should().Be(String.Empty);
        loadedEntity.Boundary.Lower.Should().Be(30);
        loadedEntity.Boundary.Upper.Should().Be(20);
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        TestEntity_with_OwnedTypes.Configure(modelBuilder);
        TestEntity_with_Enum_and_ValueObjects.Configure(modelBuilder);

        if (_registerConverters)
        {
            modelBuilder.AddEnumAndValueObjectConverters(true);
        }
    }
    public async Task Should_write_and_read_enums_and_value_types()
    {
        var entity = new TestEntity_with_Enum_and_ValueObjects
        {
            Id       = new Guid("A53F60CD-B53E-40E3-B16F-05E9A223E238"),
            TestEnum = TestEnum.Item1,
            IntBasedReferenceValueObject     = IntBasedReferenceValueObject.Create(42),
            IntBasedStructValueObject        = IntBasedStructValueObject.Create(43),
            StringBasedReferenceValueObject  = StringBasedReferenceValueObject.Create("value 1"),
            StringBasedStructValueObject     = StringBasedStructValueObject.Create("value 2"),
            TestSmartEnum_Struct_IntBased    = TestSmartEnum_Struct_IntBased.Value1,
            TestSmartEnum_Struct_StringBased = TestSmartEnum_Struct_StringBased.Value1,
            Boundary = Boundary.Create(10, 20)
        };

        _ctx.Add(entity);
        await _ctx.SaveChangesAsync();

        _ctx.ChangeTracker.Clear();
        (await _ctx.TestEntities_with_Enum_and_ValueObjects.SingleAsync())
        .Should().BeEquivalentTo(entity);
    }