diff --git a/Haberdasher.Tests/PropertyTests.cs b/Haberdasher.Tests/PropertyTests.cs index 48a8165..ceacfeb 100644 --- a/Haberdasher.Tests/PropertyTests.cs +++ b/Haberdasher.Tests/PropertyTests.cs @@ -102,32 +102,49 @@ private class TestClass [Fact] public void MarksPropertiesAsNotSelectable() { var totalProperty = _testClassType.GetProperty(t => t.Total); - var zipProperty = _testClassType.GetProperty(t => t.Zip); Assert.Equal(false, totalProperty.IsSelectable); - Assert.Equal(false, zipProperty.IsSelectable); } [Fact] public void MarksPropertiesAsNotInsertable() { var addressProperty = _testClassType.GetProperty(t => t.Address); var stateProperty = _testClassType.GetProperty(t => t.State); - var zipProperty = _testClassType.GetProperty(t => t.Zip); Assert.Equal(false, addressProperty.IsInsertable); Assert.Equal(false, stateProperty.IsInsertable); - Assert.Equal(false, zipProperty.IsInsertable); } [Fact] public void MarksPropertiesAsNotUpdatable() { var cityProperty = _testClassType.GetProperty(t => t.City); var stateProperty = _testClassType.GetProperty(t => t.State); - var zipProperty = _testClassType.GetProperty(t => t.Zip); Assert.Equal(false, cityProperty.IsUpdatable); Assert.Equal(false, stateProperty.IsUpdatable); - Assert.Equal(false, zipProperty.IsUpdatable); + } + + [Fact] + public void RemovesIgnoredPropertiesFromCache() { + var totalProperty = _testClassType.GetProperty(t => t.Total); + var cityProperty = _testClassType.GetProperty(t => t.City); + var stateProperty = _testClassType.GetProperty(t => t.State); + + // ignore: select + Assert.False(_testClassType.SelectFields.Contains(totalProperty)); + + // ignore: update + Assert.False(_testClassType.UpdateFields.Contains(cityProperty)); + + // ignore: writes + Assert.False(_testClassType.InsertFields.Contains(stateProperty)); + Assert.False(_testClassType.UpdateFields.Contains(stateProperty)); + } + + [Fact] + public void ForgetsPropertiesThatAreIgnoreAll() + { + Assert.Throws(() => _testClassType.GetProperty(t => t.Zip)); } } } diff --git a/Haberdasher/EntityType.cs b/Haberdasher/EntityType.cs index 8cc79a4..977b097 100644 --- a/Haberdasher/EntityType.cs +++ b/Haberdasher/EntityType.cs @@ -90,6 +90,58 @@ public class EntityType where TEntity : class, new() return cachedProperty; } + private void RemoveFromSelect(EntityProperty property) { + if (SelectFields.Contains(property)) + SelectFields.Remove(property); + } + + private void RemoveFromInsert(EntityProperty property) { + if (InsertFields.Contains(property)) + InsertFields.Remove(property); + } + + private void RemoveFromUpdate(EntityProperty property) { + if (UpdateFields.Contains(property)) + UpdateFields.Remove(property); + } + + private void RemoveFromFieldCache(EntityProperty property, IgnoreTypeEnum? type) + { + if (!type.HasValue) + return; + + switch (type) + { + case IgnoreTypeEnum.Select: + RemoveFromSelect(property); + + break; + + case IgnoreTypeEnum.Insert: + RemoveFromInsert(property); + + break; + + case IgnoreTypeEnum.Update: + RemoveFromUpdate(property); + + break; + + case IgnoreTypeEnum.Writes: + RemoveFromInsert(property); + RemoveFromUpdate(property); + + break; + + case IgnoreTypeEnum.All: + RemoveFromSelect(property); + RemoveFromInsert(property); + RemoveFromUpdate(property); + + break; + } + } + #endregion #region Fluent Interface Methods @@ -121,6 +173,7 @@ public class EntityType where TEntity : class, new() var cachedProperty = GetProperty(property); cachedProperty.SetIgnore(type); + RemoveFromFieldCache(cachedProperty, type); return this; }