(Fluent)NHibernate-对象级别的固有特性,但不在表级别
我有以下想法: 业务对象实现为接口或抽象类,具有某些属性,对除DAL层以外的所有层都是只读的。我还希望我的业务对象位于DAL之外的另一个程序集中(出于测试目的),因此标记属性不是我的选项 示例可以是一对一关系或其他属性 我通过以下步骤几乎解决了这个问题(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
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
}