diff --git a/src/Umbraco.Core/Models/Macro.cs b/src/Umbraco.Core/Models/Macro.cs index c0aa35e782..c754cab326 100644 --- a/src/Umbraco.Core/Models/Macro.cs +++ b/src/Umbraco.Core/Models/Macro.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; +using System.ComponentModel; using System.Linq; using System.Reflection; using System.Runtime.Serialization; @@ -125,13 +126,17 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo XsltPathSelector = ExpressionHelper.GetPropertyInfo(x => x.XsltPath); private static readonly PropertyInfo PropertiesSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); - protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e) + void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e) { OnPropertyChanged(PropertiesSelector); if (e.Action == NotifyCollectionChangedAction.Add) { - var alias = e.NewItems.Cast().Select(x => x.Alias).First(); + //listen for changes + var prop = e.NewItems.Cast().First(); + prop.PropertyChanged += PropertyDataChanged; + + var alias = prop.Alias; //remove from the removed/added props (since people could add/remove all they want in one request) _removedProperties.RemoveAll(s => s == alias); @@ -142,7 +147,11 @@ namespace Umbraco.Core.Models } else if (e.Action == NotifyCollectionChangedAction.Remove) { - var alias = e.OldItems.Cast().Select(x => x.Alias).First(); + //remove listening for changes + var prop = e.OldItems.Cast().First(); + prop.PropertyChanged -= PropertyDataChanged; + + var alias = prop.Alias; //remove from the removed/added props (since people could add/remove all they want in one request) _removedProperties.RemoveAll(s => s == alias); @@ -152,6 +161,16 @@ namespace Umbraco.Core.Models _removedProperties.Add(alias); } } + + /// + /// When some data of a property has changed ensure our Properties flag is dirty + /// + /// + /// + void PropertyDataChanged(object sender, PropertyChangedEventArgs e) + { + OnPropertyChanged(PropertiesSelector); + } internal override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties) { diff --git a/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs index 8a89c5a5b7..127a81e41b 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MacroRepository.cs @@ -148,7 +148,8 @@ namespace Umbraco.Core.Persistence.Repositories { //need to set the id explicitly here propDto.Macro = id; - Database.Insert(propDto); + var propId = Convert.ToInt32(Database.Insert(propDto)); + entity.Properties[propDto.Alias].Id = propId; } ((ICanBeDirty)entity).ResetDirtyProperties(); @@ -173,8 +174,8 @@ namespace Umbraco.Core.Persistence.Repositories if (macro.AddedProperties.Contains(propDto.Alias)) { //we need to insert since this was added and re-assign the new id - Database.Insert(propDto); - macro.Properties[propDto.Alias].Id = propDto.Id; + var propId = Convert.ToInt32(Database.Insert(propDto)); + macro.Properties[propDto.Alias].Id = propId; } else { diff --git a/src/Umbraco.Core/Persistence/RepositoryFactory.cs b/src/Umbraco.Core/Persistence/RepositoryFactory.cs index 2a5f0df9c7..72ed34aeb2 100644 --- a/src/Umbraco.Core/Persistence/RepositoryFactory.cs +++ b/src/Umbraco.Core/Persistence/RepositoryFactory.cs @@ -142,7 +142,7 @@ namespace Umbraco.Core.Persistence internal virtual IMacroRepository CreateMacroRepository(IDatabaseUnitOfWork uow) { - return new MacroRepository(uow, RuntimeCacheProvider.Current); + return new MacroRepository(uow, _disableAllCache ? (IRepositoryCacheProvider)NullCacheProvider.Current : RuntimeCacheProvider.Current); } internal virtual IMemberRepository CreateMemberRepository(IDatabaseUnitOfWork uow) diff --git a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs index 52ecf1b1e7..9efe934805 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MacroRepositoryTest.cs @@ -164,12 +164,14 @@ namespace Umbraco.Tests.Persistence.Repositories { // Act var macro = new Macro("test", "Test", "~/usercontrol/blah.ascx", "MyAssembly", "test.xslt", "~/views/macropartials/test.cshtml"); + macro.Properties.Add(new MacroProperty("test", "Test", 0, "test")); repository.AddOrUpdate(macro); unitOfWork.Commit(); // Assert Assert.That(macro.HasIdentity, Is.True); Assert.That(macro.Id, Is.EqualTo(4));//With 3 existing entries the Id should be 4 + Assert.Greater(macro.Properties.Single().Id, 0); } }