Как я могу заставить составные ключевые перечисления использовать int в беглом nhibernate с соглашением? - PullRequest
1 голос
/ 05 января 2012

У меня есть составной ключевой объект, где одно свойство является целым, а другое - перечислением. Перечисление в настоящее время отображается по строке, но оно должно быть int. У меня есть IUserTypeConvention, который уже делает это, но он не работает для составных ключей.

У меня есть метод Accept (), который правильно находит составные ключи с перечислениями в нем, но я не могу понять код Apply ().

public class CompositeKeyEnumConvention : ICompositeIdentityConvention, ICompositeIdentityConventionAcceptance
{
    public void Apply(ICompositeIdentityInstance instance)
    {
    }

    public void Accept(IAcceptanceCriteria<ICompositeIdentityInspector> criteria)
    {
        criteria.Expect(x => HasEnumKey(x));
    }

    private bool HasEnumKey(ICompositeIdentityInspector x)
    {
        if (x.KeyProperties.Count() > 0)
        {
            foreach (IKeyPropertyInspector inspector in x.KeyProperties)
            {
                if (inspector.Type.GenericArguments.Count() != 1)
                    continue;
                if (EnumConvention.IsInt32EnumType(inspector.Type.GenericArguments.First()))
                    return true;
            }
        }

        return false;
    }
}

Код действующего соглашения enum:

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType(instance.Property.PropertyType);
    }

Я просто не могу понять, как это сделать для составного ключа.

Спасибо!

1 Ответ

1 голос
/ 05 января 2012

как и мой другой ответ здесь только с отражением

public class CompositeKeyEnumConvention : ICompositeIdentityConvention
{
    public void Apply(ICompositeIdentityInstance instance)
    {
        // when instance.KeyProperties. Count == 0 nothing happens
        foreach (IKeyPropertyInstance inspector in instance.KeyProperties)
        {
            if (inspector.Type.GenericArguments.Count() != 1)
                continue;
            if (EnumConvention.IsInt32EnumType(inspector.Type.GenericArguments.First()))
            {
                var keymapping = (KeyPropertyMapping)inspector.GetType()
                    .GetField("mapping", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic)
                    .GetValue(inspector);

                keymapping.Type = inspector.Type;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...