c# - NHibernate + Fluent NHibernate 异常

标签 c# nhibernate fluent-nhibernate

问题:

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

当我尝试访问搜索过滤器时,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();
        }
    }

错误:

当访问 search.Filters 属性时,NHibernate 会尝试访问不应该存在的 Filters.DefaultSearchId 数据库列。此列存在于角色表中,但不存在于过滤器中。

问题:

是否是无效配置、Fluent NHibernate 或 NHibernate 错误?

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

谢谢。

更新: 这是 actual SQL生成

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

更新 3:Actual exception

更新 4:这是一个一般错误的特殊用例:实体将其他实体引用为“多对多”,并且在“多对多”关联的另一端。另一个实体引用源实体(在我的例子中是 DefaultQuery)。 NH 在访问源实体(在我的例子中是过滤器)的任何子集合(一对多)时变得疯狂。

更新 5:Sample data

更新 6:XML issued by Fluent NHibernate

最佳答案

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

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

关于c# - NHibernate + Fluent NHibernate 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4184645/

相关文章:

c# - 在 case 语句中返回不同的对象类型?

c# - 使用 Random 和 OrderBy 是一个好的洗牌算法吗?

.net - Nhibernate查询转换为通用列表时出错

nhibernate - 如何输出 Fluent NHibernate 创建的 HBM?

NHibernate:引用需要内连接而不是左连接

c# - Entity Framework - SQL Azure 重试策略

c# - 学习用 C# 编写多线程应用程序的引用资料?

nhibernate - 将 nHibernate 表达式匹配到嵌套表?

c# - nHibernate 异常 : Unable to cast object of type

nhibernate - 流畅的休眠 : How to change field mapping depending on the underlying database?