我在流畅的nhibernate世界中与HasManyToMany方法斗争。这是我的“数据库”应用程序。在这个数据库中,我有一些测试数据。现在我想通过Query方法询问数据库哪个用户可以使用什么用于应用程序。
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声明也错了。 感谢
答案 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