Нет сообщений об ошибках с NHibernate, NHibernate.Linq и Fluent Mapping

Я использую Nhibernate 2.1.2.4000 GA с Nhibernate.Linq 1.0 и последней версией FluentNhibernate, загруженной с мастера на github.

Я делаю несколько тестов, и всякий раз, когда я пытаюсь удалить объект, полученный с помощью запроса linq, я получаю эту ошибку:

Не сохраняется для: NHibernate.Linq.Query`1 [[Employees.Core.Entities.Employee, Employees.Core, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]

Все остальные операции (вставка, обновление и выбор) выглядят нормально;

Мой класс сущности:

public class Employee
{
    public Employee()
    {
    }

    public virtual Int32 Id { get; private set; }
    public virtual String Name { get; set; }    

    public virtual String SayHello()
    {
        return String.Format("'Hello World!', said {0}.", Name);
    }
}

Класс отображения:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name)
            .Not.Nullable()
            .Length(50);
    }
}

Конфигурация:

Assembly mappingsAssemly = Assembly.GetExecutingAssembly();

return Fluently.Configure()
    .Database( MsSqlConfiguration.MsSql2008
                    .ConnectionString(connectionString)
                    .ProxyFactoryFactory(typeof(ProxyFactoryFactory))
                    .ShowSql())                            
    .Mappings( m => m.FluentMappings.AddFromAssembly(mappingsAssemly))
    .BuildSessionFactory();

И код, который не работает:

public void RemoveAll()
{
    var q = from employee in _session.Linq<Employee>()
            select employee;

    foreach (var employee in q.ToList())
    {
        _session.Delete(q);
    }
}

Есть предположения?


person tucaz    schedule 22.01.2010    source источник
comment
+1 Чрезвычайно грамотно написанный вопрос!   -  person Michael Maddox    schedule 23.01.2010


Ответы (3)


Мы все это упустили!

Извините, ребята, и спасибо за вашу помощь, но я просто подумал.

Если вы обратите внимание на метод RemoveAll (), вы увидите, что я пытаюсь удалить объект «q», который не является сущностью, а IQueriable, вместо того, чтобы передавать «сотрудник». Это был недостаток внимания.

Правильный код будет:

        public void RemoveAll()
        {
            var q = from employee in _session.Linq()
                    select employee;

            var p = q.ToList();

            foreach (var employee in p)
            {
                _session.Delete(employee);
            }
        }
person tucaz    schedule 27.01.2010

Вы уверены, что сборка, которую вы предоставляете FNH (Assembly.GetExecutingAssembly()), на самом деле является той, которая содержит ваши сопоставления?

Измените вызов Mappings, включив метод ExportTo, который будет экспортировать любые сопоставления, найденные FNH, в указанную папку; проверьте содержимое этой папки и посмотрите, все ли там сопоставления. Если да, то скорее всего, это не проблема FNH, а проблема с провайдером Linq (как сказал Майкл).

Mappings(
  m => m.FluentMappings
          .AddFromAssembly(mappingsAssemly)
          .ExportTo(@"C:\"));

Еще одна вещь, которую вы можете проверить, - это экземпляр конфигурации NHibernate, который на самом деле использует NH. Для этого используйте BuildConfiguration вместо BuildSessionFactory и проверьте результат; есть коллекция ClassMappings (или какой-то ее вариант), которая должна содержать все отображенные сущности.

Если все в порядке, попробуйте вместо этого создать запрос, используя Criteria API или HQL, посмотрите, решит ли это вашу проблему (и в этом случае почти наверняка это будет поставщик linq).

person James Gregory    schedule 23.01.2010
comment
+1 Это могло бы стать отличной общей вики-страницей по устранению неполадок для FluentNH, если это еще не сделано! - person Michael Maddox; 26.01.2010

Это может быть просто ошибка в провайдере Linq. Вы можете попытаться воспроизвести проблему с последней магистралью NHibernate, которая включает нового / другого поставщика Linq. В качестве альтернативы, если вы (успешно) удалите Fluent NHibernate из уравнения, вы, вероятно, сможете (относительно легко) отправить тестовый пример / отчет об ошибке для поставщика Linq.

person Michael Maddox    schedule 23.01.2010