(Fluent)NHibernate-对象级别的固有特性,但不在表级别

(Fluent)NHibernate-对象级别的固有特性,但不在表级别,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有以下想法: 业务对象实现为接口或抽象类,具有某些属性,对除DAL层以外的所有层都是只读的。我还希望我的业务对象位于DAL之外的另一个程序集中(出于测试目的),因此标记属性不是我的选项 示例可以是一对一关系或其他属性 我通过以下步骤几乎解决了这个问题 abstract class User { public virtual long UserId {get; protected set;} public virtual string Password {get; protect

我有以下想法:

业务对象实现为接口或抽象类,具有某些属性,对除DAL层以外的所有层都是只读的。我还希望我的业务对象位于DAL之外的另一个程序集中(出于测试目的),因此标记属性不是我的选项

示例可以是一对一关系或其他属性

我通过以下步骤几乎解决了这个问题

abstract class User
{
    public virtual long UserId {get; protected set;}
    public virtual string Password {get; protected set;}
    ...
}
在DAL中:

public class DbUser : User
{
    internal virtual void SetPassword(string password) {...}
}
然后我使用fluent将其映射为

ClassMap<User> {...}
SubclassMap<DbUser> {...}
ClassMap{…}
子类映射{…}
我遇到的问题是fluent试图创建一个名为DbUser的表

如果跳过子类映射并创建DbUser对象并尝试保存它,则会出现“此对象无持久器”错误


有可能解决吗?

您可能会覆盖使用Fluent所做的操作

public class DbUser: IAutoMappingOverride<DbUser>
    {
        public void Override(AutoMapping<DbUser> mapping)
        {
            //tell it to do nothing now, probably tell it not to map to table,
            // not 100% on how you'd do this here.                    
        }
    }
并在AutoPersistenceModelGenerator中读取Where子句中的属性以将其排除

支票大概是

private static bool CheckPeristance(Type t) { 
            var attributes = t.GetCustomAttributes(typeof (DoNotAutoPersistAttribute), true); 
            Check.Ensure(attributes.Length<=1, "The number of DoNotAutoPersistAttribute can only be less than or equal to 1"); 
            if (attributes.Length == 0) 
                return false;
            var persist = attributes[0] as DoNotAutoPersistAttribute; 
            return persist == null; 
        } 
private static bool CheckPeristance(Type t) { 
            var attributes = t.GetCustomAttributes(typeof (DoNotAutoPersistAttribute), true); 
            Check.Ensure(attributes.Length<=1, "The number of DoNotAutoPersistAttribute can only be less than or equal to 1"); 
            if (attributes.Length == 0) 
                return false;
            var persist = attributes[0] as DoNotAutoPersistAttribute; 
            return persist == null; 
        } 
mappings.AddEntityAssembly(typeof(User).Assembly).Where(GetAutoMappingFilter);
....
...
private static bool GetAutoMappingFilter(Type t)
        {
            return t.GetInterfaces().Any(x => CheckPeristance(x)); //you'd probably have a few filters here
        }