首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate + Fluent NHibernate异常

NHibernate + Fluent NHibernate异常
EN

Stack Overflow用户
提问于 2010-11-15 13:08:35
回答 2查看 1.1K关注 0票数 3

问题

有些搜索可以存储在DB中。每个搜索都有一个过滤器集合。还有一些角色。每个角色可能具有(可空列)分配给它的默认搜索。而且,每个搜索都是对零或多个角色(多到多关系)可见的。

当我尝试访问搜索过滤器时,NH尝试访问filters.DefaultSearchId,它不存在于filters表中。

DB:

代码语言:javascript
复制
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)
);

实体:

代码语言:javascript
复制
  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; }
    }

映射:

代码语言:javascript
复制
 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");
        }
    }

代码:

代码语言:javascript
复制
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();
        }
    }

错误:

当访问search.Filters属性时,NHibernate尝试访问不应该存在的Filters.DefaultSearchId db列。此列存在于角色表中,但不存在于筛选器中。

问题:

它是无效的配置,Fluent NHibernate还是NHibernate错误?

我正在使用Server 2008 R2、NHibernate 2.1.2和Fluent NHibernate 1.1.0.685,尽管在NHibernate 3 beta 2中也存在这个问题。

谢谢。

更新:下面是生成的实际SQL

UPDATE2: CDMDOTNET,同样的错误,同样的sql,不幸的是。

UPDATE3:实际异常

UPDATE4:这是一个通用bug的特殊用例:实体将其他实体称为“多到多”,而在“多对多”的另一端则是“多到多”。另一个实体引用源实体(在我的例子中是DefaultQuery)。当访问源实体的任何子集合(一对多)时,NH会发疯(在我的例子中是过滤器)。

UPDATE5:样本数据

UPDATE6:NHibernate发布的XML

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-18 09:00:12

更新HasMany在SearchMap上的映射以包含KeyColumn():

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

票数 4
EN

Stack Overflow用户

发布于 2010-11-18 09:12:50

您没有为过滤器包指定列名。它应该设置为SearchId。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4184645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档