Почему Id, измененный с 1 на 1, происходит с помощью NHibernate - PullRequest
1 голос
/ 22 сентября 2010

У меня есть такое сопоставление

<class name="UserFileSummary" table="UserFile" lazy="false">
   <id name="FileId" column="UserFileId" type="int">
      <generator class="identity" />
   </id>...

и свойство в объекте c #, подобное этому

public long FileId { get; set; }

Что я не понимаю, так это почему, когда я получаю экземпляр, используя

var myFile = session.Get<UserFileSummary>(id)

изменить значение поля и затем сохранить его следующим образом

myFile.myProperty = newValue
session.Save(myFile)

Я получаю сообщение об ошибке, в котором говорится, что Id был изменен с 1 на 1. Есть несколько сообщений оэто, но это простой столбец int (тождество 1, 1).Я, должно быть, сделал какую-то основную ошибку, пожалуйста, кто-нибудь может помочь.Спасибо

Я добавил этот бит как редактирование, поскольку вопрос оказывается без вопросов

Свойство FileId имеет тип long, а отображение имеет тип int, чтовот почему изменение с 1 на 1. является проблемой.

Пожалуйста, дайте мне обратную связь, если вы хотите, чтобы я удалил этот вопрос, спасибо всем:)

Ответы [ 3 ]

4 голосов
/ 22 сентября 2010

Единственное, на что я могу указать из вашего кода, это использование Save для обновления существующей сущности.

Вы можете избежать явного вызова метода Save для сущности, которая уже присутствует в сеансе.Ваши изменения будут автоматически сохраняться при очистке сеанса.

Если вы настаиваете на явном вызове метода обновления, я бы сказал, что вы должны использовать SaveOrUpdate.

1 голос
/ 04 октября 2010

Ошибка в моем случае была из-за того, что тип данных long (int64) в базе данных и был сопоставлен с int (int32) в отображении. Это означало, что реальное значение менялось всякий раз, когда объект был сохранен, тем самым нарушая идентификатор. Спасибо всем, кто помог.

1 голос
/ 22 сентября 2010

Во-первых, сделайте установщик на имущество частным;проект не удастся скомпилировать, если у вас есть код, который ошибочно его устанавливает.В любом случае, это хорошая практика.Но он не является надежным, потому что внутри класса может быть код, который его устанавливает, поэтому вам придется проверить это.

public int FileId { get; private set; }

Во-вторых, внимательно изучите файл сопоставления, чтобы убедиться, что у вас нетнанесли на карту поле дважды.

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