2014-01-17 4 views
2

У меня есть эта сущность: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

+3

Случившееся 1) запрос является частью сделки * (лучше, есть Flush() вызывается в конце запроса) * и 2) Отображение не соответствует настройке БД, в основном для столбцов с нулевым vs not-null. Поэтому, если DB содержит nullable логическое значение, а значение NULL, отображение говорит: это bool * (не может быть nullable) * ... так грязный объект в сеансе ... исправить его в БД. Другие слова, сначала проверьте нулеуемость ваших столбцов ... –

+0

@ RadimKöhler, спасибо, я очистил всю нулевую, воссоздал схему и проблему все еще происходит. спасибо – Shazam

+2

Дело в том, что мы все время работаем с сеансом. Это настолько умный *, что даже во время операции чтения он отслеживает все элементы по их идентификатору. Если какой-либо объект каким-то образом изменен * (например, для целей рендеринга или переноса) * и по-прежнему ссылается на открытый сеанс, он управляется как грязный. Когда вызывается 'session.Fulsh()' (обычно по умолчанию в транзакции Commit() или даже авто, зависит от FlushMode), любой грязный объект сохраняется. Имея это: исследуйте, не изменяете ли вы какой-либо объект ... при открытии сеанса. NHibernate предсказуем, это не будет ошибкой;) –

ответ

2

Как обсуждалось в комментариях, дело в том, что мы все время работаем с сеансом. Он настолько умный, что даже во время операции чтения он отслеживает все элементы по их идентификатору.

Если какой-либо объект каким-либо образом изменен (например, для целей рендеринга или переноса) и по-прежнему ссылается на открытый сеанс, он управляется как грязный. Когда вызывается session.Fulsh() (обычно по умолчанию при транзакции Commit() или даже авто, зависит от FlushMode), любой грязный объект сохраняется.

Таким образом, чтобы избежать выдачи инструкции UPDATE, должно совпадать отображение Entity и его содержимое. По состоянию на конец Shazam основан вне, в этом случае преступник был это отображение

// Map(x => x.Role).CustomType<int>(); 
Map(x => CustomType<Role>() 
+0

Я думаю, что я узнал из ваших 2 первых комментариев больше всего. Я не знал о грязных на флеш. спасибо снова – Shazam

+0

Отлично, если это помогло. Наслаждайтесь NHibernate, просто потрясающим инструментом;) –

Смежные вопросы