• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lucaslorentz / auto-compute / 20057011414

09 Dec 2025 08:21AM UTC coverage: 81.626% (-1.1%) from 82.723%
20057011414

push

github

lucaslorentz
Use EFCoreChangeset to calculate original member values

212 of 275 new or added lines in 14 files covered. (77.09%)

1 existing line in 1 file now uncovered.

1888 of 2313 relevant lines covered (81.63%)

963.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.24
/src/LLL.AutoCompute.EFCore/Internal/EFCoreObservedProperty.cs
1
using LLL.AutoCompute.EFCore.Metadata.Internal;
2
using Microsoft.EntityFrameworkCore;
3
using Microsoft.EntityFrameworkCore.ChangeTracking;
4
using Microsoft.EntityFrameworkCore.Metadata;
5

6
namespace LLL.AutoCompute.EFCore.Internal;
7

8
public class EFCoreObservedProperty(
140✔
9
    IProperty property)
140✔
10
    : EFCoreObservedMember, IObservedProperty
11
{
12
    public override IProperty Member => property;
14,178✔
13
    public override string Name => Member.Name;
×
14
    public virtual IObservedEntityType EntityType => Member.DeclaringType.ContainingEntityType.GetOrCreateObservedEntityType();
3,536✔
15

16
    public override string ToDebugString()
17
    {
18
        return $"{Member.DeclaringType.ShortName()}.{Member.Name}";
×
19
    }
20

21
    protected override object? GetOriginalValue(ComputedInput input, object ent, Func<object> currentValueGetter)
22
    {
23
        var entityState = EntityType.GetEntityState(input, ent);
122✔
24

25
        if (entityState == ObservedEntityState.Added)
122✔
UNCOV
26
            throw new Exception($"Cannot access property '{Member.DeclaringType.ShortName()}.{Member.Name}' original value for an added entity");
×
27

28
        var change = input.Get<EFCoreChangeset>().GetChange(Member, ent);
122✔
29
        if (change is not null)
122✔
30
            return change.OriginalValue;
38✔
31

32
        return currentValueGetter();
84✔
33
    }
34

35
    protected override object? GetCurrentValue(ComputedInput input, object ent, Func<object> currentValueGetter)
36
    {
37
        var entityState = EntityType.GetEntityState(input, ent);
3,414✔
38

39
        if (entityState == ObservedEntityState.Removed)
3,414✔
40
            throw new Exception($"Cannot access property '{Member.DeclaringType.ShortName()}.{Member.Name}' current value for a deleted entity");
×
41

42
        return currentValueGetter();
3,414✔
43
    }
44

45
    public override async Task CollectChangesAsync(DbContext dbContext, EFCoreChangeset changes)
46
    {
47
        foreach (var entityEntry in dbContext.EntityEntriesOfType(Member.DeclaringType))
9,896✔
48
        {
49
            await CollectChangesAsync(entityEntry, changes);
3,078✔
50
        }
51
    }
52

53
    public override async Task CollectChangesAsync(EntityEntry entityEntry, EFCoreChangeset changes)
54
    {
55
        if (entityEntry.State == EntityState.Added
3,088✔
56
            || entityEntry.State == EntityState.Deleted
3,088✔
57
            || entityEntry.State == EntityState.Modified)
3,088✔
58
        {
59
            var propertyEntry = entityEntry.Property(Member);
2,722✔
60
            if (entityEntry.State == EntityState.Added
2,722✔
61
                || entityEntry.State == EntityState.Deleted
2,722✔
62
                || propertyEntry.IsModified)
2,722✔
63
            {
64
                var originalValue = entityEntry.State == EntityState.Added
2,586✔
65
                    ? null
2,586✔
66
                    : propertyEntry.OriginalValue;
2,586✔
67

68
                var currentValue = entityEntry.State == EntityState.Deleted
2,586✔
69
                    ? null
2,586✔
70
                    : propertyEntry.CurrentValue;
2,586✔
71

72
                changes.RegisterPropertyChange(Member, entityEntry.Entity, originalValue, currentValue);
2,586✔
73
            }
74
        }
75
    }
76

77
    public async Task<IReadOnlyList<ObservedPropertyChange>> GetChangesAsync(ComputedInput input)
78
    {
79
        return input.Get<EFCoreChangeset>().GetChanges(Member);
2,630✔
80
    }
81
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc