流畅的nhibernate映射多对多的配置错误

时间:2013-06-12 06:35:16

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我在流畅的nhibernate世界中与HasManyToMany方法斗争。这是我的“数据库”应用程序。在这个数据库中,我有一些测试数据。现在我想通过Query方法询问数据库哪个用户可以使用什么用于应用程序。 enter image description here

这是我的模型类:

    public class Application
    {
        public virtual int Id { get; protected set; }

        public virtual string Name { get; set; }

        public virtual IList<User> User { get; set; }

        public Application()
        {
            User = new List<User>();
        }
    }

    public class User
    {
        public virtual int Id { get; protected set; }

        public virtual string Name { get; set; }

        public virtual IList<Application> Application { get; set; }

        public User()
        {
            Application = new List<Application>();
        }
    }

,这是映射代码:

    public class ApplicationMap : ClassMap<Application>
    {
        public ApplicationMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            HasManyToMany(x => x.User)
               .Table("Access")
               .ParentKeyColumn("user_fk")
               .ChildKeyColumn("id")
               .Cascade.All();
        }
    }

    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            HasManyToMany(x => x.Application)
               .Table("Access")
               .ParentKeyColumn("application_fk")
               .ChildKeyColumn("id")
               .Cascade.All();
        }
    }

这是我的数据访问方法:

    public static List<Application> SelectApplicationByUser(int userId)
    {
        var session = SessionManager.CurrentSession;
        return session.Query<Application>().Where(x => x.User.Any(y => y.Id == userId)).ToList();  
    }

现在我收到错误未知列用户ID。有人可以给我一些踢,我搜索了很长时间并使用了很多方法,但没有任何效果。我的映射定义有什么问题?或许我的Linq声明也错了。 感谢

1 个答案:

答案 0 :(得分:1)

父列是搜索持有者ID(应用程序)的位置。子元素是用户表中要搜索的引用ID。

public ApplicationMap()
{
   Id(x => x.Id);
   Map(x => x.Name);
   HasManyToMany(x => x.User)
       .Table("Access")
       .ParentKeyColumn("application_fk")
       .ChildKeyColumn("user_fk")
       .Cascade.All();
}

与用户相似

    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasManyToMany(x => x.Application)
           .Table("Access")
           .ParentKeyColumn("user_fk")
           .ChildKeyColumn("application_fk")
           .Inverse()            // this is essential
           .Cascade.All();
    }

注意:其中一个集合必须映射为Inverse()。这将正确解决插入,更新...

的顺序问题
  

注2:非常重要的说明。很可能不需要Cascade。   在许多关系中,总是处理对表。该   在这种情况下级联意味着更改所有引用的用户实体,   更改申请时。

在此处阅读更多内容:23.2. Author/Work