У меня есть эта сущность:Nhibernate обновление объекта при выборе
public class Permission
{
public virtual int Id{get;set;}
public virtual string Entity { get; set; }
public virtual bool ReadAction { get; set; }
public virtual bool UpdateAction { get; set; }
public virtual bool CreateAction { get; set; }
public virtual bool DeleteAction { get; set; }
public virtual Role Role { get; set; }
public virtual string RoleName
{
get { return Enum.GetName(typeof(Role),this.Role}
}
}
public class PermissionMap : ClassMap<Permission>
{
public PermissionMap()
{
Id(x => x.Id, "id").GeneratedBy.Identity().UnsavedValue(0);
Map(x => x.Entity);
Map(x => x.DeleteAction).CustomType<BooleanType>();
Map(x => x.ReadAction).CustomType<BooleanType>();
Map(x => x.CreateAction).CustomType<BooleanType>();
Map(x => x.UpdateAction).CustomType<BooleanType>();
Map(x => x.Role).CustomType<int>();
}
}
public enum Role
{
Administrator = 0,
SalesPerson = 1,
Marketing = 2
}
Каждый раз, когда я запрос к базе данных он обновляется.
Я думал, что это из-за RoleName, но событие, когда я удалил его, все еще получает обновление.
Разрешение получает обновление для каждой строки, имеющейся в базе данных. Thanks
Случившееся 1) запрос является частью сделки * (лучше, есть Flush() вызывается в конце запроса) * и 2) Отображение не соответствует настройке БД, в основном для столбцов с нулевым vs not-null. Поэтому, если DB содержит nullable логическое значение, а значение NULL, отображение говорит: это bool * (не может быть nullable) * ... так грязный объект в сеансе ... исправить его в БД. Другие слова, сначала проверьте нулеуемость ваших столбцов ... –
@ RadimKöhler, спасибо, я очистил всю нулевую, воссоздал схему и проблему все еще происходит. спасибо – Shazam
Дело в том, что мы все время работаем с сеансом. Это настолько умный *, что даже во время операции чтения он отслеживает все элементы по их идентификатору. Если какой-либо объект каким-то образом изменен * (например, для целей рендеринга или переноса) * и по-прежнему ссылается на открытый сеанс, он управляется как грязный. Когда вызывается 'session.Fulsh()' (обычно по умолчанию в транзакции Commit() или даже авто, зависит от FlushMode), любой грязный объект сохраняется. Имея это: исследуйте, не изменяете ли вы какой-либо объект ... при открытии сеанса. NHibernate предсказуем, это не будет ошибкой;) –