简体   繁体   English

NHibernate + Fluent NHibernate异常

[英]NHibernate + Fluent NHibernate exception

Problem : 问题

There are searches that can be stored in the DB. 有些搜索可以存储在DB中。 Each search has a collection of filters. 每个搜索都有一组过滤器。 Also there are roles. 还有角色。 Each role may have (nullable column) a default search assigned to it. 每个角色可以(可空列)分配一个默认搜索。 Also, each search is visible to zero or many roles (many-to-many relationship). 此外,每个搜索对零或多个角色(多对多关系)可见。

When I try to access the search filters, NH tries to access filters.DefaultSearchId, which doesn't exist in filters table. 当我尝试访问搜索过滤器时,NH尝试访问过滤器表中不存在的filters.DefaultSearchId。

DB: D B:

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

Entities: 实体:

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

Mappings: 映射:

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

Code: 码:

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

ERROR: 错误:

When accessing the search.Filters property, NHibernate tries to access Filters.DefaultSearchId db column which is not supposed to be there. 当访问search.Filters属性,NHibernate的尝试访问这是不应该在那里Filters.DefaultSearchId数据库列。 This column exists in Roles table but not in filters. 此列存在于Roles表中,但不存在于过滤器中。

QUESTION: 题:

Is it invalid configuration, Fluent NHibernate or NHibernate bug? 是配置无效,Fluent NHibernate还是NHibernate错误?

I'm using SQL Server 2008 R2, NHibernate 2.1.2 and Fluent NHibernate 1.1.0.685, although this issue exists in NHibernate 3 beta 2 as well. 我正在使用SQL Server 2008 R2,NHibernate 2.1.2和Fluent NHibernate 1.1.0.685,尽管这个问题也存在于NHibernate 3 beta 2中。

Thank you. 谢谢。

UPDATE: Here is the actual SQL generated 更新:这是实际生成的SQL

UPDATE2: CDMDOTNET, same error, same sql, unfortunately. UPDATE2:CDMDOTNET,同样的错误,同样的sql,不幸的是。

UPDATE3: Actual exception 更新3: 实际例外

UPDATE4: This is a particular use case of a general bug: Entity references other entities as 'many-to-many' and on the other side of 'many-to-many' assoc. 更新4:这是一个常见错误的特定用例:实体引用其他实体为“多对多”,另一方面引用“多对多”关联。 the other entity references the source entity (DefaultQuery in my case). 另一个实体引用源实体(在我的例子中是DefaultQuery)。 NH goes nuts when accessing any child collection (one-to-many) of a source entity (Filters in my case). 在访问源实体的任何子集合(一对多)时,NH会疯狂(在我的情况下为过滤器)。

UPDATE5: Sample data 更新5: 样本数据

UPDATE6: XML issued by Fluent NHibernate UPDATE6: Fluent NHibernate发布的XML

Update the HasMany mapping on the SearchMap to include the KeyColumn(): 更新SearchMap上的HasMany映射以包含KeyColumn():

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

You didn't specify the column name for the Filters bag. 您没有指定Filters包的列名。 It should be set to SearchId. 它应该设置为SearchId。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM