NHibernate + Fluent NHibernate 异常

3

问题:

有一些可以存储在数据库中的搜索。每个搜索都有一组筛选器。此外,还有角色。每个角色可能会分配(可空列)默认搜索。此外,每个搜索对零个或多个角色可见(多对多关系)。

当我尝试访问搜索过滤器时,NH 尝试访问 filters.DefaultSearchId,但是该列在 filters 表中不存在。

数据库:

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();
        }
    }

错误:

访问search.Filters属性时,NHibernate尝试访问不存在于filters中的Filters.DefaultSearchId数据库列。该列存在于Roles表中但不在filters中。

问题:

这是无效的配置、Fluent NHibernate还是NHibernate的错误?

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

谢谢。

更新: 这里是生成的实际SQL

更新2:CDMDOTNET,同样的错误,同样的sql,不幸的是。

更新3:实际异常

更新4:这是一个一般性错误的特定用例:实体引用其他实体作为“多对多”,在“多对多”关联的另一侧,另一个实体引用源实体(在我的情况下是DefaultQuery)。当访问源实体(在我的情况下是Filters)的任何子集合(一对多)时,NH会出现问题。

更新5:示例数据

更新6:Fluent NHibernate发布的XML


你能同时发布生成的SQL查询吗? - Simon Bartlett
你能发布实际错误信息吗? - UpTheCreek
我如何查看Fluent生成的实际XML?我想找出是NH bug还是Fluent NH bug。 - Valentin V
你能提供一些测试数据吗?我可以在NH3/Beta2中成功运行代码。 - Phill
1
啊,你可以通过在HasMany中添加KeyColumn来解决这个问题,就像我上一条评论中所说的那样。Fluent可能会因为角色映射而感到困惑,很奇怪。 - Phill
显示剩余8条评论
2个回答

4

更新SearchMap中的HasMany映射以包括KeyColumn():

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


SO说我只能在5个小时后奖励悬赏,所以会等到那时候。 - Valentin V
没问题,调试很有趣。 - Phill

0

您没有为Filters包指定列名。应该将其设置为SearchId。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接