Skip to content

Commit 13932c6

Browse files
authored
fix: Changed Updates to ignore default constraint. Also improved exception messages (#98)
1 parent a2272fd commit 13932c6

File tree

11 files changed

+70
-42
lines changed

11 files changed

+70
-42
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<!-- Directory.Build.props -->
22
<Project>
33
<PropertyGroup>
4-
<Version>1.9.1</Version>
4+
<Version>1.10.0</Version>
55
</PropertyGroup>
66
</Project>
77

src/Dapper.DDD.Repository.MySql/MySqlQueryGenerator.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public string GenerateInsertQuery(TAggregate aggregate)
109109

110110
public string GenerateUpdateQuery(TAggregate aggregate)
111111
{
112-
var setClause = GenerateSetClause(aggregate);
112+
var setClause = GenerateSetClause();
113113

114114
if (string.IsNullOrEmpty(setClause))
115115
{
@@ -135,21 +135,19 @@ public string GenerateUpsertQuery(TAggregate aggregate)
135135
var semicolonIndex = insertQuery.IndexOf(';');
136136
var insertPart = insertQuery[..semicolonIndex];
137137
var selectQuery = GenerateGetQuery();
138-
var setClause = GenerateSetClause(aggregate);
138+
var setClause = GenerateSetClause();
139139
var onDuplicateClause = string.IsNullOrWhiteSpace(setClause)
140140
? ""
141141
: $" ON DUPLICATE KEY UPDATE {setClause}";
142142
return $"{insertPart}{onDuplicateClause};{selectQuery}";
143143
}
144144

145145
#region Helpers
146-
private string GenerateSetClause(TAggregate aggregate)
146+
private string GenerateSetClause()
147147
{
148148
var primaryKeys = _keys;
149-
var propertiesWithDefaultValues = _defaultConstraints;
150149
var propertiesToSet = _properties.Where(property =>
151-
!primaryKeys.Contains(property) && property.HasSetter &&
152-
(!propertiesWithDefaultValues.Contains(property) || !property.HasDefaultValue(aggregate)));
150+
!primaryKeys.Contains(property) && property.HasSetter );
153151
return string.Join(", ", propertiesToSet.Select(property => $"{property.Name} = @{property.Name}"));
154152
}
155153

src/Dapper.DDD.Repository.PostGreSql/PostGreSqlQueryGenerator.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public string GenerateGetQuery()
9292

9393
public string GenerateUpdateQuery(TAggregate aggregate)
9494
{
95-
var setClause = GenerateSetClause(aggregate);
95+
var setClause = GenerateSetClause();
9696

9797
if (string.IsNullOrEmpty(setClause))
9898
{
@@ -117,7 +117,7 @@ public string GenerateUpsertQuery(TAggregate aggregate)
117117
: insertQuery; // All identities are default => do an insert
118118
}
119119

120-
var setClause = GenerateSetClause(aggregate);
120+
var setClause = GenerateSetClause();
121121
if (string.IsNullOrEmpty(setClause))
122122
throw new InvalidOperationException("PostGreSql does not support Upsert on tables with no updatable columns.");
123123

@@ -138,13 +138,11 @@ public string GeneratePropertyList(string tableName)
138138
return string.Join(", ", _properties.Select(property => GeneratePropertyClause(tableName, property)));
139139
}
140140

141-
private string GenerateSetClause(TAggregate aggregate)
141+
private string GenerateSetClause()
142142
{
143143
var primaryKeys = _keys;
144-
var propertiesWithDefaultValues = _defaultConstraints;
145144
var propertiesToSet = _properties.Where(property =>
146-
!primaryKeys.Contains(property) && property.HasSetter &&
147-
(!propertiesWithDefaultValues.Contains(property) || !property.HasDefaultValue(aggregate)));
145+
!primaryKeys.Contains(property) && property.HasSetter );
148146
var result = string.Join(", ",
149147
propertiesToSet.Select(property =>
150148
$"{property.Name} = @{property.Name}"));

src/Dapper.DDD.Repository.Sql/SqlQueryGenerator.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public string GenerateGetQuery()
130130

131131
public string GenerateUpdateQuery(TAggregate aggregate)
132132
{
133-
var setClause = GenerateSetClause(aggregate);
133+
var setClause = GenerateSetClause();
134134

135135
if (string.IsNullOrEmpty(setClause))
136136
{
@@ -159,7 +159,7 @@ public string GenerateUpsertQuery(TAggregate aggregate)
159159
}
160160

161161
var whereClause = GenerateWhereClause();
162-
var setClause = GenerateSetClause(aggregate);
162+
var setClause = GenerateSetClause();
163163
var updateQuery = string.IsNullOrEmpty(setClause)
164164
? GenerateGetQuery() // Use select query instead of update, as nothing can be updated but we still expect the aggregate to be returned
165165
: GenerateUpdateQuery(aggregate);
@@ -181,13 +181,11 @@ public string GeneratePropertyList(string tableName)
181181
return string.Join(", ", _properties.Select(property => GeneratePropertyClause(tableName, property)));
182182
}
183183

184-
private string GenerateSetClause(TAggregate aggregate)
184+
private string GenerateSetClause()
185185
{
186186
var primaryKeys = _keys;
187-
var propertiesWithDefaultValues = _defaultConstraints;
188187
var propertiesToSet = _properties.Where(property =>
189-
!primaryKeys.Contains(property) && property.HasSetter &&
190-
(!propertiesWithDefaultValues.Contains(property) || !property.HasDefaultValue(aggregate)));
188+
!primaryKeys.Contains(property) && property.HasSetter);
191189
var result = string.Join(", ",
192190
propertiesToSet.Select(property =>
193191
$"{_schemaAndEntity}.{AddSquareBrackets(property.Name)} = @{property.Name}"));

src/Dapper.DDD.Repository/Exceptions/DapperRepositoryQueryException.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ namespace Dapper.DDD.Repository.Exceptions;
33
public class DapperRepositoryQueryException : Exception
44
{
55
public DapperRepositoryQueryException(string query, Exception innerException) : base(
6-
$"Exception when executing query: {query}", innerException)
6+
$"""
7+
{innerException.Message}
8+
9+
query: {query}
10+
""", innerException)
711
{
812
}
913
}

src/Dapper.DDD.Repository/Reflection/MemberAccessor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ public MemberAccessor(PropertyInfo property)
2121
}
2222

2323
Name = property.Name;
24+
HasSetter = property.CanWrite;
2425
_getter = GetGetMethod(property);
2526
_setter = GetSetMethod(property);
2627
}
2728

28-
public bool HasGetter => _getter != null;
29-
public bool HasSetter => _setter != null;
29+
public bool HasSetter { get; }
3030
public string Name { get; }
3131

3232
public object? GetValue(object target)

tests/Dapper.DDD.Repository.Sql.IntegrationTests/TriggerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public async Task UpdateAsync_WithIdentity_ReturnsUpdatedEntity()
9090
var inserted = await _identityRepository.InsertAsync(entityToInsert);
9191

9292
// Act
93-
var updatedEntity = await _identityRepository.UpdateAsync(new TriggerEntityWithIdentity { Id = inserted.Id, Name = "Updated Hello World" });
93+
var updatedEntity = await _identityRepository.UpdateAsync(new TriggerEntityWithIdentity { Id = inserted.Id, Name = "Updated Hello World", DateCreated = DateTime.UtcNow });
9494

9595
// Assert
9696
Assert.NotNull(updatedEntity);
@@ -106,7 +106,7 @@ public async Task UpdateAsync_WithoutIdentity_ReturnsUpdatedEntity()
106106
await _noIdentityRepository.InsertAsync(entityToInsert);
107107

108108
// Act
109-
var updatedEntity = await _noIdentityRepository.UpdateAsync(new TriggerEntityWithoutIdentity { Id = id, Name = "Updated Hello World" });
109+
var updatedEntity = await _noIdentityRepository.UpdateAsync(new TriggerEntityWithoutIdentity { Id = id, Name = "Updated Hello World", DateCreated = DateTime.UtcNow });
110110

111111
// Assert
112112
Assert.NotNull(updatedEntity);

tests/Dapper.DDD.Repository.UnitTests/Aggregates/CompositePrimaryKeyAggregate.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ internal record CompositePrimaryKeyAggregate
55
public string Username { get; init; } = default!;
66
public string Password { get; init; } = default!;
77

8-
public DateTime DateCreated { get; }
8+
public DateTime DateCreated { get; init; }
99
}

tests/Dapper.DDD.Repository.UnitTests/QueryGenerators/MySqlQueryGeneratorTests.cs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public void Constructor_TableNameIsNull_Throws()
1919
() => new MySqlQueryGenerator<SinglePrimaryKeyAggregate>(configuration));
2020

2121
Assert.Equal("Value cannot be null. (Parameter 'readConfiguration.EntityName')", ex.Message);
22-
2322
}
2423

2524
[Fact]
@@ -37,10 +36,10 @@ public void Constructor_TableNameIsWhiteSpace_Throws()
3736
public void Constructor_SchemaIsNotNull_Throws()
3837
{
3938
// Arrange
40-
var configuration = new TableAggregateConfiguration<SinglePrimaryKeyAggregate> { TableName = "Some name", Schema = " "};
39+
var configuration = new TableAggregateConfiguration<SinglePrimaryKeyAggregate> { TableName = "Some name", Schema = " " };
4140
// Act && Assert
4241
var ex = Assert.Throws<ArgumentException>(() => new MySqlQueryGenerator<SinglePrimaryKeyAggregate>(configuration));
43-
42+
4443
Assert.Equal("MySql doesn't support Schema. (Parameter 'configuration')", ex.Message);
4544
}
4645

@@ -121,6 +120,7 @@ public void GenerateDeleteQuery_CompositePrimaryKey_Valid()
121120
@"SELECT Users.Username, Users.Password, Users.DateCreated FROM Users WHERE Users.Username = @Username AND Users.Password = @Password;DELETE FROM Users WHERE Users.Username = @Username AND Users.Password = @Password;",
122121
deleteQuery);
123122
}
123+
124124
#endregion
125125

126126
#region GetAll
@@ -177,6 +177,7 @@ public void GenerateGetAllQuery_ProperTableName_Valid()
177177
// Assert
178178
Assert.Equal("SELECT Users.Id, Users.Username, Users.Password FROM Users;", selectQuery);
179179
}
180+
180181
#endregion
181182

182183
#region Get
@@ -251,6 +252,7 @@ public void GenerateGetQuery_CompositePrimaryKey_Valid()
251252
"SELECT Users.Username, Users.Password, Users.DateCreated FROM Users WHERE Users.Username = @Username AND Users.Password = @Password;",
252253
selectQuery);
253254
}
255+
254256
#endregion
255257

256258
#region Insert
@@ -262,11 +264,11 @@ public void GenerateInsertQuery_HasMultipleIdentityProperties_Throws()
262264
var defaultConfig = new DefaultConfiguration();
263265
var config = new TableAggregateConfiguration<AggregateWithNestedValueObject> { TableName = "Users" };
264266
config.HasKey(x => x.Id);
265-
config.HasIdentity((x => x.Id));
266-
config.HasIdentity((x => x.FirstLevel));
267+
config.HasIdentity(x => x.Id);
268+
config.HasIdentity(x => x.FirstLevel);
267269
config.SetDefaults(defaultConfig);
268270
var generator = new MySqlQueryGenerator<AggregateWithNestedValueObject>(config);
269-
271+
270272
// Act && Assert
271273
var ex = Assert.Throws<InvalidOperationException>(() => generator.GenerateInsertQuery(new AggregateWithNestedValueObject(
272274
Guid.NewGuid(),
@@ -412,6 +414,7 @@ public void GenerateInsertQuery_CompositePrimaryKey_Valid()
412414
@"INSERT INTO Users (Username, Password, DateCreated) VALUES (@Username, @Password, @DateCreated);SELECT Users.Username, Users.Password, Users.DateCreated FROM Users WHERE Users.Username = @Username AND Users.Password = @Password;",
413415
insertQuery);
414416
}
417+
415418
#endregion
416419

417420
#region Update
@@ -523,6 +526,7 @@ public void GenerateUpdateQuery_PropertyHasNoSetter_PropertyIsExcluded()
523526
@"UPDATE Users SET Age = @Age WHERE Users.Id = @Id;SELECT Users.Id, Users.Age, Users.DateCreated FROM Users WHERE Users.Id = @Id;",
524527
query);
525528
}
529+
526530
#endregion
527531

528532
#region Upsert
@@ -535,7 +539,7 @@ public void GenerateUpsertQuery_HasIdentity_ReturnsPureInsertQuery()
535539

536540
// Act
537541
var query = generator.GenerateUpsertQuery(new SinglePrimaryKeyAggregate());
538-
var insertQuery = generator.GenerateInsertQuery(new SinglePrimaryKeyAggregate());
542+
var insertQuery = generator.GenerateInsertQuery(new SinglePrimaryKeyAggregate());
539543

540544
// Assert
541545
Assert.Equal(insertQuery, query);
@@ -548,7 +552,7 @@ public void GenerateUpsertQuery_HasIdentityWithExistingValue_ReturnsPureUpdateQu
548552
var generator = CreateSinglePrimaryKeyAggregateQueryGenerator();
549553

550554
// Act
551-
var query = generator.GenerateUpsertQuery(new SinglePrimaryKeyAggregate{ Id = 42 });
555+
var query = generator.GenerateUpsertQuery(new SinglePrimaryKeyAggregate { Id = 42 });
552556
var updateQuery = generator.GenerateUpdateQuery(new SinglePrimaryKeyAggregate());
553557

554558
// Assert
@@ -574,18 +578,23 @@ public void GenerateUpsertQuery_HasNoIdentity_Valid()
574578
public void GenerateUpsertQuery_HasNoUpdatableColumns_Valid()
575579
{
576580
// Arrange
577-
var generator = CreateHasDefaultConstraintAggregateQueryGenerator();
581+
var configuration =
582+
new TableAggregateConfiguration<AllPropertiesHasMissingSetterAggregate> { TableName = "Users" };
583+
configuration.HasKey(aggregate => aggregate.Id);
584+
configuration.HasDefault(aggregate => aggregate.DateCreated);
585+
var generator = new MySqlQueryGenerator<AllPropertiesHasMissingSetterAggregate>(configuration);
578586

579587
// Act
580-
var query = generator.GenerateUpsertQuery(new HasDefaultConstraintAggregate());
588+
var query = generator.GenerateUpsertQuery(new AllPropertiesHasMissingSetterAggregate());
581589

582590
// Assert
583591
Assert.Equal(
584592
@"INSERT INTO Users (Id) VALUES (@Id);SELECT Users.Id, Users.DateCreated FROM Users WHERE Users.Id = @Id;",
585593
query);
586594
}
595+
587596
#endregion
588-
597+
589598
#region Constructors
590599

591600
private static MySqlQueryGenerator<HasDefaultConstraintAggregate>

0 commit comments

Comments
 (0)