簡體   English   中英

NHibernate + Fluent NHibernate異常

[英]NHibernate + Fluent NHibernate exception

問題

有些搜索可以存儲在DB中。 每個搜索都有一組過濾器。 還有角色。 每個角色可以(可空列)分配一個默認搜索。 此外,每個搜索對零或多個角色(多對多關系)可見。

當我嘗試訪問搜索過濾器時,NH嘗試訪問過濾器表中不存在的filters.DefaultSearchId。

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

實體:

  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數據庫列。 此列存在於Roles表中,但不存在於過濾器中。

題:

是配置無效,Fluent NHibernate還是NHibernate錯誤?

我正在使用SQL Server 2008 R2,NHibernate 2.1.2和Fluent NHibernate 1.1.0.685,盡管這個問題也存在於NHibernate 3 beta 2中。

謝謝。

更新:這是實際生成的SQL

UPDATE2:CDMDOTNET,同樣的錯誤,同樣的sql,不幸的是。

更新3: 實際例外

更新4:這是一個常見錯誤的特定用例:實體引用其他實體為“多對多”,另一方面引用“多對多”關聯。 另一個實體引用源實體(在我的例子中是DefaultQuery)。 在訪問源實體的任何子集合(一對多)時,NH會瘋狂(在我的情況下為過濾器)。

更新5: 樣本數據

UPDATE6: Fluent NHibernate發布的XML

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

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

您沒有指定Filters包的列名。 它應該設置為SearchId。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM