问题
有些搜索可以存储在DB中。每个搜索都有一个过滤器集合。还有一些角色。每个角色可能具有(可空列)分配给它的默认搜索。而且,每个搜索都是对零或多个角色(多到多关系)可见的。
当我尝试访问搜索过滤器时,NH尝试访问filters.DefaultSearchId,它不存在于filters表中。
DB:
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 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
发布于 2010-11-18 09:00:12
更新HasMany在SearchMap上的映射以包含KeyColumn():
x.Filters).KeyColumn("SearchId").Inverse().Cascade.All().AsBag();(x => =>)
发布于 2010-11-18 09:12:50
您没有为过滤器包指定列名。它应该设置为SearchId。
https://stackoverflow.com/questions/4184645
复制相似问题