NHibernate以特定顺序映射多对多

时间:2011-08-09 22:39:42

标签: c# .net nhibernate

我有一张Users表和一张Profiles表。一个用户可以拥有许多配置文件,配置文件可以拥有许多用户。另一个要求是,用户的配置文件应在保存到数据库时保留其指定的顺序。因此,我有以下关系:

tables

如何使用NHibernate将其正确映射到类?是创建另一个类UserProfile且具有Order属性并引用UserProfile的类的唯一方法吗?这是一种更时尚的技术吗?我想避免这种情况,因为它会添加另一个抽象层,而这个抽象层并不是必需的。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

我已经多次看过这个问题了,如果没有创建 UserProfile 实体,我认为我没有看到优秀的解决方案。

您可以做的一件事是仅在Users或Profiles类中引用此实体。例如,在向用户添加新配置文件时,您可以执行此类操作:

public virtual AddProfile(Profile profileToAdd, int order)
{
    //Create middle man object
    UserProfile newUserProfile = new UserProfile(this.Id, profileToAdd, order);
    this.UserProfiles.Add(newUserProfile);
}

这在你的情况下可能并不完美,但是如果你想要抽象这个中间人以便你只在你的实体中处理它,我认为上面的例子给你一个开始。

答案 1 :(得分:1)

我实际上找到了正确的方法来解决这个问题。

FluentMappings映射应使用 AsMap(indexColumnName) <map name="Profiles"><index column="Order" type="integer" /></map>

// Inside the UserMapping (or an AutoMappingOverride).
this.ManyToMany(u => u.Profiles).AsMap("`Order`"); // "Order" is the column we want!

// Which produces this SQL - SQLite in my case:
create table ProfileToUser (
    User_id INT not null,
    Profile_id INT not null,
    "Order" INT not null,           // Exactly what I wanted.
    primary key (User_id, Order))