diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs
index 335beb9ee4..650f664254 100644
--- a/src/Umbraco.Core/Models/Member.cs
+++ b/src/Umbraco.Core/Models/Member.cs
@@ -20,6 +20,17 @@ namespace Umbraco.Core.Models
private object _providerUserKey;
private Type _userTypeKey;
+ ///
+ /// Constructor for creating a Member object
+ ///
+ /// Name of the content
+ /// ContentType for the current Content object
+ public Member(string name, IMemberType contentType)
+ : base(name, -1, contentType, new PropertyCollection())
+ {
+ _contentType = contentType;
+ }
+
public Member(string name, string email, string username, string password, int parentId, IMemberType contentType)
: base(name, parentId, contentType, new PropertyCollection())
{
diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
index 8854f169cd..dbaec8471a 100644
--- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs
@@ -265,8 +265,10 @@ namespace Umbraco.Core.Persistence.Repositories
//Updates Modified date
((Member)entity).UpdatingEntity();
+ var dirtyEntity = (ICanBeDirty) entity;
+
//Look up parent to get and set the correct Path and update SortOrder if ParentId has changed
- if (((ICanBeDirty)entity).IsPropertyDirty("ParentId"))
+ if (dirtyEntity.IsPropertyDirty("ParentId"))
{
var parent = Database.First("WHERE id = @ParentId", new { ParentId = ((IUmbracoEntity)entity).ParentId });
((IUmbracoEntity)entity).Path = string.Concat(parent.Path, ",", entity.Id);
@@ -302,8 +304,27 @@ namespace Umbraco.Core.Persistence.Repositories
//Updates the current version - cmsContentVersion
//Assumes a Version guid exists and Version date (modified date) has been set/updated
Database.Update(dto.ContentVersionDto);
- //Updates the cmsMember entry
- Database.Update(dto);
+
+ //Updates the cmsMember entry if it has changed
+ var changedCols = new List();
+ if (dirtyEntity.IsPropertyDirty("Email"))
+ {
+ changedCols.Add("Email");
+ }
+ if (dirtyEntity.IsPropertyDirty("Username"))
+ {
+ changedCols.Add("LoginName");
+ }
+ // DO NOT update the password if it is null or empty
+ if (dirtyEntity.IsPropertyDirty("Password") && entity.Password.IsNullOrWhiteSpace() == false)
+ {
+ changedCols.Add("Password");
+ }
+ //only update the changed cols
+ if (changedCols.Count > 0)
+ {
+ Database.Update(dto, changedCols);
+ }
//TODO ContentType for the Member entity
@@ -337,7 +358,7 @@ namespace Umbraco.Core.Persistence.Repositories
UpdatePropertyTags(entity, _tagRepository);
- ((ICanBeDirty)entity).ResetDirtyProperties();
+ dirtyEntity.ResetDirtyProperties();
}
protected override void PersistDeletedItem(IMember entity)
diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
index fa75070ad4..49a63a007e 100644
--- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
+++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs
@@ -189,6 +189,63 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
+ [Test]
+ public void MemberRepository_Does_Not_Replace_Password_When_Null()
+ {
+ IMember sut;
+ var provider = new PetaPocoUnitOfWorkProvider();
+ var unitOfWork = provider.GetUnitOfWork();
+ MemberTypeRepository memberTypeRepository;
+ using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
+ {
+ var memberType = MockedContentTypes.CreateSimpleMemberType();
+ memberTypeRepository.AddOrUpdate(memberType);
+ unitOfWork.Commit();
+
+ var member = MockedMember.CreateSimpleContent(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty", -1);
+ repository.AddOrUpdate(member);
+ unitOfWork.Commit();
+
+ sut = repository.Get(member.Id);
+ //when the password is null it will not overwrite what is already there.
+ sut.Password = null;
+ repository.AddOrUpdate(sut);
+ unitOfWork.Commit();
+ sut = repository.Get(member.Id);
+
+ Assert.That(sut.Password, Is.EqualTo("123"));
+ }
+ }
+
+ [Test]
+ public void MemberRepository_Can_Update_Email_And_Login_When_Changed()
+ {
+ IMember sut;
+ var provider = new PetaPocoUnitOfWorkProvider();
+ var unitOfWork = provider.GetUnitOfWork();
+ MemberTypeRepository memberTypeRepository;
+ using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
+ {
+ var memberType = MockedContentTypes.CreateSimpleMemberType();
+ memberTypeRepository.AddOrUpdate(memberType);
+ unitOfWork.Commit();
+
+ var member = MockedMember.CreateSimpleContent(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty", -1);
+ repository.AddOrUpdate(member);
+ unitOfWork.Commit();
+
+ sut = repository.Get(member.Id);
+ sut.Username = "This is new";
+ sut.Email = "thisisnew@hello.com";
+ repository.AddOrUpdate(sut);
+ unitOfWork.Commit();
+ sut = repository.Get(member.Id);
+
+ Assert.That(sut.Email, Is.EqualTo("thisisnew@hello.com"));
+ Assert.That(sut.Username, Is.EqualTo("This is new"));
+ }
+ }
+
[Test]
public void Can_Create_Correct_Subquery()
{