一次覆盖多种类型的Fluent NHibernate默认级联

时间:2012-01-11 12:15:19

标签: nhibernate c#-4.0 .net-4.0 fluent-nhibernate fluent-nhibernate-mapping

我有一个像这样定义的抽象实体基类:

public abstract class SessionItem : Entity
{
    public virtual Session Session { get; set; }
}

此外,我使用自动映射:

private AutoPersistenceModel CreateAutomappings()
{
    return AutoMap
        // configuration
        .Conventions.Add(DefaultCascade.All())
        // more configuration
}

SessionItem有几个派生类/表,我想覆盖所有这些的级联策略。我尝试了以下方法:

public class SessionItemAutommapingOverride : IAutoMappingOverride<SessionItem>
{
    public void Override(AutoMapping<SessionItem> mapping)
    {
        mapping.References(x => x.Session).Cascade.None();
    }
}

但遗憾的是,由于SessionItem是抽象的(并且未映射),因此不会调用覆盖。我宁愿避免为每个子类重写它(使用IAutoMappingOverride)。

有没有办法覆盖多种类型的级联,而不使用IAutoMappingOverride&lt;&gt;对于每一个?

2 个答案:

答案 0 :(得分:2)

显然,这可以通过使用IReferenceConvention来实现:

public class CascadeNoneOverrideConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        // override
    }
}

答案 1 :(得分:2)

public class SessionReferenceCascadeNone : IReferenceConvention, IReferenceConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IManyToOneInspector> criteria)
    {
        criteria.Expect(x =>
            typeof(SessionItem).IsAssignableFrom(x.EntityType) &&
            x.Property.PropertyType == typeof(Session));
    }

    public void Apply(IManyToOneInstance instance)
    {
        instance.Cascade.None();
    }
}