Переопределение FluentNHibernate DefaultCascade для многих типов одновременно

У меня есть абстрактный базовый класс сущности, определенный следующим образом:

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<> для каждого?

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();
    }
}

По-видимому, это возможно с помощью IReferenceConvention:

public class CascadeNoneOverrideConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        // override
    }
}
Другие вопросы по тегам