【问题标题】:How can I make composite key enums use int in fluent nhibernate with a convention?如何通过约定使复合键枚举在流利的 nhibernate 中使用 int?
【发布时间】:2012-02-02 21:31:39
【问题描述】:

我有一个复合键实体,其中一个属性是 int,另一个是枚举。枚举当前是按字符串映射的,但它需要是 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;
    }
}

有效的枚举约定的代码是

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

我只是不知道如何为复合键做到这一点。

谢谢!

【问题讨论】:

    标签: nhibernate fluent-nhibernate composite-key


    【解决方案1】:

    就像我的其他回答 here 一样,只有反射

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

    【讨论】:

    • 我不得不用这个替换 keymapping.Type 行:keymapping.Type = new TypeReference(inspector.Type.GenericArguments.First());
    猜你喜欢
    • 2010-12-01
    • 2011-10-20
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多