У меня есть простая связь «многие ко многим» между классом User и классом Place. Эта связь представлена свойством пользователя "Соседство".
public class User
{
public virtual IList<UserPlace> Neighbourhood { get; set; }
}
Класс UserPlace - это просто компонент, который добавляет одну часть информации к отношениям между пользователем и местом:
public class UserPlace
{
public virtual User User { get; set; }
public virtual Place Place { get; set; }
public virtual bool IsDefault { get; set; }
}
Отношения отображаются следующим образом:
public class UserMappings : ClassMap<User>
{
//... other mappings
HasMany(x => x.NeighbourHood)
.Component(c =>
{
c.Map(x => x.IsDefault);
c.References(x => x.Place).Cascade.None();
}
).Not.LazyLoad().Cascade.SaveUpdate();
}
При создании пользователя из базы данных загружается ряд мест, которые добавляются к пользователю, причем для одного из них устанавливается значение по умолчанию. Когда пользователь сохраняется, связанные объекты UserPlace также сохраняются.
Проблема, с которой я столкнулся, заключается в том, что каждый объект Place, связанный с UserPlace, также обновляется. Это не желаемый эффект, и я попытался предотвратить выполнение Cascade to Place (каламбур не предназначен), установив Cascade на None () ... но это ничего не меняет.
Мне удалось остановить это обновление, только указав, что каждое свойство в Place не должно обновляться ([PropertyName] .Not.Updated ()). Это работает, но это не решение.
Есть ли у кого-нибудь идеи, как я могу этого не допустить?
Изменить: для сопоставления объекта "Место" также задана функция DynamicUpdate (), поэтому объект не должен изменяться при сохранении пользователя.
PS! Я не думаю, что это имеет значение для этого сценария (но я могу ошибаться!), Но учтите и это: объекты Place загружаются вне NHibernate (с использованием ADO.NET и хранимой процедуры , из-за некоторых геопространственных запросов, которые я не мог выполнить с NHibernate), а затем подключился к сеансу, вызвав Session.Update () для каждого объекта.