5

ダイアグラム

以下にリストされているUsersRolesテーブルをマップする方法を理解しようとして、ここで髪を引っ張っています。私はハゲがよく見えないので助けてください:)

//これがエンティティです

public class UsersRole
{
    public UsersRole() { }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    public virtual System.Guid UserId { get; set; }
    public virtual System.Guid RoleId { get; set; }


}

//これまでのマッピングは次のとおりです

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        Table("UsersRoles");
        Lazy(true);

       // ComponentAsId(); How does this work??


        Property(x => x.UserId, map => map.Column(c =>
            {
                c.Name("UserId");
                c.NotNullable(true);
                c.Length(30);
                c.SqlType("uniqueidentifier");
            }));
        Property(x => x.RoleId, map => map.Column(c =>
            {
                c.Name("RoleId");
                c.NotNullable(true);
                c.Length(30);
                c.SqlType("uniqueidentifier");
            }));
    }
}

ComponentAsIdのマッピングのコメントを参照してください

誰かが私を正しい軌道に乗せることができれば、事前に感謝します

4

3 に答える 3

5

あなたが探しているメソッドは呼ばれComposedIdます:

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        ComposedId(map => 
        {
            map.Property(x => x.UserId);
            map.Property(x => x.RoleId);
        });
    }
}

どのように機能するかについてのあなたの質問に答えますComponentAsIdComponentAsIdメソッドを使用するには、次のクラスが必要です

public class UsersRoleId
{
    public System.Guid UserId { get; set; }
    public System.Guid RoleId { get; set; }
}

public class UsersRole
{
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    public virtual UsersRoleId Id { get; set; }
}

これで、UsersRole.Idを次のようにマップできます。ComponentAsId

public class UsersRoleMap : ClassMapping<UsersRole>
{
    public UsersRoleMap()
    {
        ComponentAsId(x => x.Id);
    }
}

PS:なぜUsersRolesテーブルをマップする必要があるのですか?ユーザーを多対多の関係としての役割にマッピングすることをお勧めします。

public class UsersMap : ClassMapping<User>
{
    public UsersMap()
    {
        Set(x => x.Roles, x => { }, x => x.ManyToMany());
    }
}

public class RolesMap : ClassMapping<Role>
{
    public RolesMap()
    {
        Set(x => x.Users, x => { }, x => x.ManyToMany());
    }
}
于 2012-08-01T16:15:54.217 に答える
1

あなたは本当にUsersRole実体として持つ必要がありますか?通常、2つのIDを除いて、データベーステーブルにいくつかの追加の列がある場合にのみ、多対多のエンティティを作成します。

さらに、別のエンティティを作成する必要がある場合でもUserIdRoleIdプロパティを持っている必要はありません。持っているUserRoleプロパティはNHibernateでマッピングするのに十分です。

代わりに多対多のマッピングを見て、次のようにユーザーエンティティを定義してください。

public class User
{
    // other properties
    public virtual IList<Role> Roles { get; set; }
}

ManyToManyこれで、マッピングを使用してそのRoleプロパティをマップできます。

Bag(x => x.Roles, collectionMapping =>
{
    collectionMapping.Table("UsersRole");
    collectionMapping.Key(k => k.Column("RoleId"));
}, map => map.ManyToMany(p => p.Column("UserId")));

もう1つのを示します。

于 2012-08-01T16:13:57.613 に答える
0

以下は、NHibernateMapping-By-Codeを使用して複合キーのマッピングを実装する2つの方法です。

ComponentAsId(x => x.Key, m =>
{
    m.Property(x => x.KeyPart);
    // etc.
});

ComposedId(m =>
{
    m.Property(x => x.KeyPart);
    // other key parts
});
于 2013-09-13T00:03:45.477 に答える