Должен ли я делать ссылки в беглом Nhibernate Not Nullable? - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть что-то подобное на моей карте

public class Settings : ClassMap<Setting>
{
  References(x => x.User).Not.Nullable();
}

Теперь каждый раз, когда я хочу сохранить настройки, я должен предоставить ему объект пользователя, в противном случае я получаю

свойство not-null ссылается на ноль или переходное значение

Я думал, что, делая это, я навязываю реляционные ограничения. Однако мне кажется странным, что я должен передать весь объект, когда ему действительно нужно просто использовать Fk.

Я надеюсь, что это не повторное сохранение всего этого внутри, а просто добавление Fk для сохранения реляционных ограничений.

Так я правильно это делаю?

Редактировать

 public class Settings : ClassMap<Setting>
 {
      Id(x => x.SettingId);
      Map(x => x.Something);
      Map(x => x.Something2);
      References(x => x.User).Not.Nullable();
 }


Public class User: ClassMap<User>
{
   Id(x => x.UserId);
   Map(x => x.FirstName);
   Map(x => x.LastName);
   HasOne(x => x.Settings);
   HasMany(x => x.AnotherTable);
}


Settings s = new Settings()
{
      Something = "142",
      Something2 = "1421414"
};

session.Create(s); // this will crash as s.User equals null;

Я должен сделать это

User user = repo.GetUser("userId");

Settings s = new Settings()
{
      Something = "142",
      Something2 = "1421414",
      User = user
};

session.Create(s); // this should work.

Теперь мне интересно, так как я сделал User = user; Nhibernate просто захватывает userId и сохраняет его в настройках tbl, или он проверяет таблицу пользователей на предмет изменений, а затем проверяет «другую таблицу» на предмет изменений?

Или он мгновенно обновляет все поля для пользовательской таблицы и другой таблицы.

Имеет ли это смысл того, что я подразумеваю под спасением всего объекта?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Вы говорите NHibernate, чтобы проверить это свойство для пустых значений с помощью .Not.Nullable().

Конечно, он будет жаловаться, если оно пустое, с соответствующим сообщением.

Если вы хотите, чтобы онобыть обреченным ... просто не говорите иначе: -)

Обновление: у меня все еще есть проблемы с пониманием того, что вас беспокоит.Если вы извлекаете экземпляр User (на самом деле, вам даже не нужно идти в БД, если у вас есть Id; просто используйте session.Load) и не изменяете какие-либо свойства, почему NHibernate «перезаписывает» его?

1 голос
/ 24 февраля 2011

Нет, он не будет повторно сохранять / обновлять пользовательский объект. Он только получит свой идентификатор и обновит колонку Fk. Если вы не хотите знать, что происходит за кулисами, попробуйте использовать SQL Server Profiler (если ваша БД - MSSQL) или NHibernate Profiler .

Кстати, проверьте этот пост Айенде , он рассказывает о различных способах сохранения / обновления / удаления каскадов в NHibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...