NHibernate + Свободное NHibernate исключение - PullRequest
3 голосов
/ 15 ноября 2010

Проблема :

Есть поиски, которые можно сохранить в БД.Каждый поиск имеет коллекцию фильтров.Также есть роли.Каждой роли может быть назначен (обнуляемый столбец) поиск по умолчанию.Кроме того, каждый поиск виден для нуля или для многих ролей (отношение «многие ко многим»).

Когда я пытаюсь получить доступ к поисковым фильтрам, NH пытается получить доступ к filters.DefaultSearchId, которого нет в фильтрах.таблица.

БД:

CREATE TABLE [dbo].[Searches]
(
    Id int identity(1,1) primary key,
    Description nvarchar(2000) not null
);

CREATE TABLE [dbo].[Filters]
(
    Id int identity(1,1) primary key,
    Description nvarchar(2000) not null,
    SearchId int not null references Searches(Id)
);

CREATE TABLE [dbo].[Roles]
(
    Id int identity(1,1) primary key,
    Name nvarchar(255) not null,
    DefaultSearchId int null references Searches(Id)
);
CREATE TABLE [dbo].[SearchesRoles]
(
    SearchId int not null references Searches(Id),
    RoleId int not null references Roles(Id)
);

Объекты:

  public class Search {
        public virtual int Id { get; set; }
        public virtual string Description { get; set; }
        public virtual ICollection<Filter> Filters { get; set; }
        public virtual ICollection<Role> Roles { get; set; }
    }

    public class Filter {
        public virtual int Id { get; set; }
        public virtual string Description { get; set; }
        public virtual Search Search { get; set; }
    }

    public class Role {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual Search DefaultSearch { get; set; }
    }

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

 public class SearchMap : ClassMap<Search>{
        public SearchMap() {
            Table("Searches");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Description);
            HasMany(x => x.Filters).Inverse().Cascade.All().AsBag();
            HasManyToMany(x => x.Roles).Table("SearchesRoles").ParentKeyColumn("SearchId").ChildKeyColumn("RoleId");
        }
    }

 public class FilterMap : ClassMap<Filter> {
        public FilterMap() {
            Table("Filters");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Description);
            References(x => x.Search).Column("SearchId");
        }
    }
 public class RoleMap : ClassMap<Role> {
        public RoleMap() {
            Table("Roles");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Name);
            References(x => x.DefaultSearch).Column("DefaultSearchId");
        }
    }

Код:

class Program {
        static void Main() {
            var sessionFactory = CreateSessionFactory();
            using (var session = sessionFactory.OpenSession()) {
                var search = session.Get<Search>(1);
                foreach (var filter in search.Filters) {
                    Console.WriteLine(filter);
                }
            }
        }

        static ISessionFactory CreateSessionFactory(){
            string connectionString = @"server=.\sql2008; user id = sa; pwd=1; database = nhbug;";
            return Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
                .Mappings(m=>m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())).BuildSessionFactory();
        }
    }

ОШИБКА:

При доступе к поиску . Фильтры свойство, NHibernate пытается получить доступ к Filters.DefaultSearchId db столбцу, который не должен быть там.Этот столбец существует в таблице ролей, но не в фильтрах.

ВОПРОС:

Это недопустимая конфигурация, ошибка Fluent NHibernate или NHibernate?

I 'используя SQL Server 2008 R2, NHibernate 2.1.2 и Fluent NHibernate 1.1.0.685, хотя эта проблема существует и в NHibernate 3 beta 2.

Спасибо.

ОБНОВЛЕНИЕ: Вот фактический SQL сгенерированный

UPDATE2: CDMDOTNET, та же ошибка, тот же SQL, к сожалению.

UPDATE3: Фактическое исключение

UPDATE4Это частный случай использования общей ошибки: сущность ссылается на другие сущности как «многие ко многим» и по другую сторону от «многие ко многим».другая сущность ссылается на исходную сущность (в моем случае DefaultQuery).NH сходит с ума при доступе к любой дочерней коллекции (один-ко-многим) исходной сущности (Фильтры в моем случае).

UPDATE5: Пример данных

ОБНОВЛЕНИЕ 6: XML выпущен Fluent NHibernate

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Обновите отображение HasMany в SearchMap, включив в него KeyColumn ():

HasMany (x => x.Filters) .KeyColumn ("SearchId") .Inverse ().. Cascade.All () AsBag ();

0 голосов
/ 18 ноября 2010

Вы не указали имя столбца для пакета Filters.Должен быть установлен SearchId.

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