代码之家  ›  专栏  ›  技术社区  ›  Fredrik Jansson

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

  •  0
  • Fredrik Jansson  · 技术社区  · 16 年前

    我有以下想法:

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

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

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

    public class DbUser : User
    {
        internal virtual void SetPassword(string password) {...}
    }
    

    然后我使用fluent将其映射为

    ClassMap<User> {...}
    SubclassMap<DbUser> {...}
    

    我遇到的问题是fluent试图创建一个名为DbUser的表。

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

    1 回复  |  直到 16 年前
        1
  •  0
  •   dove    16 年前

    您可能会覆盖使用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.                    
            }
        }
    

    public class DoNotAutoPersistAttribute : Attribute
    {
    }
    

    并在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; 
            } 
    

    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
            }
    
    推荐文章