private SiteInfo CloneSiteInfo(SiteInfo source) { return new SiteInfo { Zone = source.Zone, Environment = source.Environment }; }
private void TestComplexCurentValue(DbEntityEntry<Building> entityEntry, DbComplexPropertyEntry<Building, SiteInfo> propertyEntry, Func<SiteInfo> getter) { var initialState = entityEntry.State; // Get this nested entry at the beginning and check that they remain in sync var environmentEntry = propertyEntry.Property(i => i.Environment); Assert.Equal(initialState == EntityState.Modified, propertyEntry.IsModified); Assert.Equal("Clean", propertyEntry.CurrentValue.Environment); Assert.Equal("Clean", environmentEntry.CurrentValue); // Getting complex object should return actual object Assert.Same(getter(), propertyEntry.CurrentValue); // Set to same value; prop should not get marked as modified propertyEntry.CurrentValue = getter(); Assert.Equal(initialState == EntityState.Modified, propertyEntry.IsModified); Assert.Equal(initialState, entityEntry.State); // Set to new object with the same values; should get marked as modified var sameInfo = CloneSiteInfo(getter()); propertyEntry.CurrentValue = sameInfo; Assert.Equal("Clean", propertyEntry.CurrentValue.Environment); Assert.Equal("Clean", environmentEntry.CurrentValue); CheckPropertyIsModified(entityEntry, (DbComplexPropertyEntry)propertyEntry, initialState); Assert.Same(sameInfo, getter()); // Reset state if (initialState == EntityState.Unchanged) { entityEntry.State = EntityState.Unchanged; } // Set to new value; prop marked as modified var newInfo = new SiteInfo { Zone = 2, Environment = "Contaminated" }; propertyEntry.CurrentValue = newInfo; Assert.Equal("Contaminated", propertyEntry.CurrentValue.Environment); Assert.Equal("Contaminated", environmentEntry.CurrentValue); CheckPropertyIsModified(entityEntry, (DbComplexPropertyEntry)propertyEntry, initialState); Assert.Same(newInfo, getter()); // New value reflected in record if (initialState != EntityState.Deleted && initialState != EntityState.Detached) { var siteValues = entityEntry.CurrentValues.GetValue<DbPropertyValues>("Address").GetValue<DbPropertyValues>( "SiteInfo"); Assert.Equal("Contaminated", siteValues["Environment"]); // Change record; new value reflected in entry siteValues["Environment"] = "Peachy"; Assert.Equal("Peachy", propertyEntry.CurrentValue.Environment); } // Set to null Assert.Throws<InvalidOperationException>(() => propertyEntry.CurrentValue = null).ValidateMessage( "DbPropertyValues_ComplexObjectCannotBeNull", "SiteInfo", "Address"); }
private void TestComplexOriginalValue(DbEntityEntry<Building> entityEntry, DbPropertyEntry<Building, SiteInfo> propertyEntry) { var initialState = entityEntry.State; if (initialState == EntityState.Added) { Assert.Throws<InvalidOperationException>(() => { var _ = propertyEntry.OriginalValue; }).ValidateMessage ("DbPropertyValues_CannotGetValuesForState", "OriginalValues", "Added"); Assert.Throws<InvalidOperationException>(() => propertyEntry.OriginalValue = new SiteInfo()). ValidateMessage("DbPropertyValues_CannotGetValuesForState", "OriginalValues", "Added"); return; } if (initialState == EntityState.Detached) { Assert.Throws<InvalidOperationException>(() => { var _ = propertyEntry.OriginalValue; }).ValidateMessage ("DbPropertyEntry_NotSupportedForDetached", "OriginalValue", propertyEntry.Name, typeof(Building).Name); Assert.Throws<InvalidOperationException>(() => propertyEntry.OriginalValue = new SiteInfo()). ValidateMessage("DbPropertyEntry_NotSupportedForDetached", "OriginalValue", propertyEntry.Name, typeof(Building).Name); return; } Assert.Equal(initialState == EntityState.Modified, propertyEntry.IsModified); Assert.Equal("Clean", propertyEntry.OriginalValue.Environment); // Set to new object with the same values; should not get marked as modified because no values changing var sameInfo = CloneSiteInfo(propertyEntry.OriginalValue); propertyEntry.OriginalValue = sameInfo; Assert.Equal("Clean", propertyEntry.OriginalValue.Environment); Assert.Equal(initialState == EntityState.Modified, propertyEntry.IsModified); Assert.Equal(initialState, entityEntry.State); // Set to new value; prop marked as modified var newInfo = new SiteInfo { Zone = 2, Environment = "Contaminated" }; propertyEntry.OriginalValue = newInfo; Assert.Equal("Contaminated", propertyEntry.OriginalValue.Environment); CheckPropertyIsModified(entityEntry, propertyEntry, initialState); // New value reflected in record if (initialState != EntityState.Added && initialState != EntityState.Detached) { var siteValues = entityEntry.OriginalValues.GetValue<DbPropertyValues>("Address").GetValue<DbPropertyValues>( "SiteInfo"); Assert.Equal("Contaminated", siteValues["Environment"]); // Change record; new value reflected in entry siteValues["Environment"] = "Peachy"; Assert.Equal("Peachy", propertyEntry.OriginalValue.Environment); } // Set to null Assert.Throws<InvalidOperationException>(() => propertyEntry.OriginalValue = null).ValidateMessage( "DbPropertyValues_ComplexObjectCannotBeNull", "SiteInfo", "Address"); }