NHibernate StaleStateException при удалении дочернего объекта - PullRequest
0 голосов
/ 01 февраля 2011

Можно ли что-то сказать о происхождении этого исключения из StackTrace?

StaleStateException:  Unexpected row count: 0; expected: 1

Я отображаю коллекции родительских / дочерних объектов в нескольких объектах DataGridView и выполняю различные команды добавления / удаления / сохранения. Это исключение возникает при попытке удалить дочернюю строку / сущность. Я использую DefaultCascadeAll соглашение .

После этого исключения соответствующая родительская сущность была удалена из базы данных, даже если это не требовалось. Таким образом, на следующем рисунке я запускаю программу; Store Id = 55 не существует.

Окно программы: http://img822.imageshack.us/img822/4686/ss20110201212511.png

StackTrace: http://img145.imageshack.us/img145/408/ss20110201211702.png

Отображения:

public class StoreMap : ClassMap<Store>
{
    public StoreMap()
    {
        Id(x => x.Id);
        Map(x =>  x.Name);
        HasMany(x => x.Staff)    
            .Inverse()            
            .Cascade.All();       
        HasManyToMany(x => x.Products)
            .Cascade.All()
            .Table("StoreProduct");    
    }

}

public class EmployeeMap : ClassMap<Employee> 
{

    public EmployeeMap()
    {
        Id(x => x.Id);                
        Map(x => x.FirstName);
        Map(x => x.LastName);
        References(x => x.Store);    
    }
}

EDIT1:

    private void btnDeleteEmployee_MouseDown(object sender, MouseEventArgs e)
    {
        var item = bsEmployees.Current;    // BindingSource
        Employee emp = new Employee();

        if (item.GetType() == emp.GetType())
        {
           emp = (Employee)bsEmployees.Current;
           EmployeeRepository.Delete(emp);
        }            
    }

Ответы [ 2 ]

0 голосов
/ 03 февраля 2011

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

Тем не менее, как уже отмечалось, эта короткая область сеанса в большинстве случаев не является хорошим решением.

    public static void Delete(Employee employee)
    {
        using (ISession session = FNH_Manager.OpenSession())
        {
            using (ITransaction transaction = session.BeginTransaction())
            {
                if (Employee.Id != 0)
                {
                  var emp =  session.Get(typeof(Employee), employee.Id);

                  if (emp != null)
                  {
                    session.Delete(emp);
                    transaction.Commit();
                  }
                }
            }
        }
    } 
0 голосов
/ 02 февраля 2011

Чтобы исправить каскады, которые вам не нужны, измените отображение на Cascade.None

Для быстрого исправления устаревшего состояния сделайте что-то вроде:

private void btnDeleteEmployee_MouseDown(object sender, MouseEventArgs e)
{
    if (item.GetType() == emp.GetType())
    {
       emp = EmployeeRepository.GetById(((Employee)beEmployees.Current).Id);
       EmployeeRepository.Delete(emp);
    }            
}

Это ужасный дизайн, но, может быть, этого будет достаточно, чтобы вы смогли найти лучший вариант после того, как вы преодолеете ошибку.

НТН,
Berrryl

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