Nhibernate在选择时更新实体

时间:2014-01-17 10:37:55

标签: nhibernate

我有这个实体:

public class Permission 
{
    public virtual int Id{get;set;}
    public virtual string Entity { get; set; }
    public virtual bool ReadAction { get; set; }
    public virtual bool UpdateAction { get; set; }
    public virtual bool CreateAction { get; set; }
    public virtual bool DeleteAction { get; set; }
    public virtual Role Role { get; set; }

    public virtual string RoleName
    {
        get { return Enum.GetName(typeof(Role),this.Role}
    }
}

public class PermissionMap : ClassMap<Permission>
{
    public PermissionMap()
    {
        Id(x => x.Id, "id").GeneratedBy.Identity().UnsavedValue(0);
        Map(x => x.Entity);
        Map(x => x.DeleteAction).CustomType<BooleanType>();
        Map(x => x.ReadAction).CustomType<BooleanType>();
        Map(x => x.CreateAction).CustomType<BooleanType>();
        Map(x => x.UpdateAction).CustomType<BooleanType>();
        Map(x => x.Role).CustomType<int>();
    }
}

public enum Role 
{
   Administrator = 0,
   SalesPerson = 1,
   Marketing = 2
}

每当我查询数据库时,它都会被更新 我认为这是因为RoleName,但是当我删除它时仍然会获得更新的事件 权限获取它在数据库中的每一行的更新。 感谢

1 个答案:

答案 0 :(得分:2)

正如评论中所讨论的那样,重点是,我们一直在使用会话。它非常智能,即使在读取操作期间,它也可以通过ID跟踪所有项目。

如果,任何对象以某种方式更改(例如,出于渲染或转移原因)并且仍然被开放会话引用,则将其作为脏对象进行管理。调用session.Fulsh()时(通常默认情况下在事务Commit()或甚至auto上,依赖于FlushMode)任何脏对象都会被持久化。

因此,为避免发出UPDATE语句,实体映射及其内容必须匹配。在最后Shazam成立时,在这种情况下,罪魁祸首就是这种映射

// Map(x => x.Role).CustomType<int>();
Map(x => CustomType<Role>()