我有一个IAuditable
接口,可以将我的类域定义为可审核。
public interface IAuditable
{
DateTime CreateAt { get; }
IUser CreateBy { get; }
DateTime? UpdateAt { get; }
IUser UpdateBy { get; }
}
对于实现此接口的这些类(有很多),配置是相同的!所以我决定覆盖惯例:
public class AudityConvention : IAutoMappingOverride<IAuditable>
{
public void Override(AutoMapping<IAuditable> mapping)
{
mapping.Map(p => p.CreateAt).ReadOnly().Access.Property().Not.Nullable().Not.Update().Default("getDate()").Generated.Insert();
mapping.References<Usuario>(p => p.CreateBy).Not.Nullable().Not.Update();
mapping.Map(p => p.UpdateAt).ReadOnly().Access.Property().Default("getDate()").Not.Insert().Generated.Always();
mapping.References<Usuario>(p => p.UpdateBy).Nullable().Not.Insert();
}
}
并配置它
_configuration = Fluently.Configure() // All config from app.config
.Mappings(m =>
{
m.AutoMappings.Add(
AutoMap.AssemblyOf<Usuario>()
.UseOverridesFromAssemblyOf<AudityConvention>()
.Conventions.Setup(c => c.AddFromAssemblyOf<EnumConvention>())
);
m.FluentMappings
.AddFromAssemblyOf<UsuarioMap>()
.Conventions.AddFromAssemblyOf<EnumConvention>()
;
})
.BuildConfiguration();
SessionFactory = _configuration.BuildSessionFactory();
Session = SessionFactory.OpenSession();
var export = new SchemaExport(_configuration);
export.Drop(false, true); // drop and recreate the database (Just to make sure that the settings are being applied)
export.Execute(false, true, false); // Create de database
使用此 app.config
<appSettings>
<add key="FluentAssertions.TestFramework" value="mstest"/>
</appSettings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.connection_string_name">Data</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
例如域类:
public class Entidade : IAuditable
{
public virtual int Id { get; protected set; }
[StringLength(255)]
public virtual string Nome { get; set; }
// Implements IAuditable
public virtual DateTime CreateAt { get; protected set; }
public virtual IUser CreateBy { get; set; }
public virtual DateTime? UpdateAt { get; protected set; }
public virtual IUser UpdateBy { get; set; }
}
并绘制地图:
public class EntidadeMap : ClassMap<Entidade>
{
public EntidadeMap()
{
Id(p => p.Id);
Map(p => p.Nome);
Table("Entidades");
}
}
结果:
我做错了什么?
如何为实现IAuditable
设置的所有类创建约定是相同的!
下面的配置部分稍后添加。根据我的阅读,仅通过AutoMappings
约定覆盖支持。
m.AutoMappings.Add(
AutoMap.AssemblyOf<Usuario>()
.UseOverridesFromAssemblyOf<AudityConvention>()
.Conventions.Setup(c => c.AddFromAssemblyOf<EnumConvention>())
);
答案 0 :(得分:0)
我觉得你运气不好。我不相信覆盖在接口上工作。 你最好做这样的事情:
public class BaseAuditable : IAuditable
{
....
}
public class Entidade : BaseAuditable
{ ... }
您可以使用
IAutoMappingOverride<BaseAuditable> instead of IAutoMappingOverride<IAuditable>
我希望我错了,但是我尝试用界面运行很多次没有运气。
答案 1 :(得分:0)
可能性
var overrideMethod = typeof(AutoPersistenceModel).GetMethod("Override");
foreach (var type in typeof(IAuditable).Assembly)
{
if (typeof(IAuditable).IsAssignableFrom(type))
{
overrideMethod.MakeGenericMethod(type).Invoke(new Action<IAuditable>(MapAuditables));
}
}