流畅的Nhibernate多对多映射与额外列,更新

时间:2012-11-12 12:53:07

标签: fluent-nhibernate mapping many-to-many

无法将数据更新/插入数据库 这是我的表格:

角色(身份证,姓名,......)

特权(身份证,姓名,......)

RolePrivilege(Id,RoleId,PrivilegeId,IsAllowed)

我有地图:

public class RoleWithPrivilegesEntityMap : ClassMap<RoleWithPrivilegesEntity>
{
        public RoleWithPrivilegesEntityMap()
        {
            Table( "ROLE" );
            Not.LazyLoad();
            Id( x => x.Id, "ID" ).GeneratedBy.Identity();
            Map( x => x.Name, "NAME" ).Not.Nullable().Length( 100 );
            HasMany(x => x.RolePrivileges)
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join().KeyColumn("RoleId");
        }
}

public class PrivilegeEntityMap : ClassMap<PrivilegeEntity>
{
    public PrivilegeEntityMap()
    {
        Table("PRIVILEGE");
        Id(x => x.Id, "ID").GeneratedBy.Identity();
        Map(x => x.Name, "NAME").Not.Nullable();
        HasMany(x => x.RolePrivileges)
            .Cascade.AllDeleteOrphan()
            .Inverse()
            .Fetch.Join().KeyColumn("PrivilegeId");
    }
}

public class RolePrivilegeEntityMap : ClassMap<RolePrivilegeEntity>
{
        public RolePrivilegeEntityMap()
        {
            Table("ROLEPRIVILEGE");
            Id(x => x.Id, "R_ID").GeneratedBy.Identity();
            Map(x => x.IsAllowed, "ISALLOWED").Not.Nullable();
            References(x => x.Role)
                .Not.Nullable()
                .Column("R_ID");
            References(x => x.Privilege)
                .Not.Nullable()
                .Column("P_ID");
        }
}

我正在尝试更新现有记录

session.SaveOrUpdate(rolePrivilege)

数据库make insert into RolePrivilege,但我需要先删除记录。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

通常没有任何内容会进入数据库,因为您从不致电session.Flush()transaction.Commit()。但是使用Id generation Identity,您基本上会强制NHibernate立即插入,因此您会看到INSERT语句。

您还可以删除RolePrivilegeEntity中的ID并在Role and Priviledge上形成compositeId,这也可以提高性能(无需立即插入)。