如何使组合键枚举在具有约定的fluent nhibernate中使用int?

如何使组合键枚举在具有约定的fluent nhibernate中使用int?,nhibernate,fluent-nhibernate,composite-key,Nhibernate,Fluent Nhibernate,Composite Key,我有一个复合键实体,其中一个属性是int,另一个是enum。枚举当前正在按字符串映射,但它必须是int。我有一个IUserTypeConvention,它已经做到了这一点,但它不适用于复合键 我有一个Accept()方法,它可以正确地定位包含枚举的组合键,但我无法理解Apply()代码 我只是不知道如何为复合密钥执行此操作 谢谢 就像我的另一个答案一样,只是经过深思熟虑 public class CompositeKeyEnumConvention : ICompositeIdentityCon

我有一个复合键实体,其中一个属性是int,另一个是enum。枚举当前正在按字符串映射,但它必须是int。我有一个IUserTypeConvention,它已经做到了这一点,但它不适用于复合键

我有一个Accept()方法,它可以正确地定位包含枚举的组合键,但我无法理解Apply()代码

我只是不知道如何为复合密钥执行此操作

谢谢

就像我的另一个答案一样,只是经过深思熟虑

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;
            }
        }
    }
}
就像我的另一个答案一样,只是经过深思熟虑

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=newtypereference(inspector.Type.genericalarguments.First());我不得不将keymapping.Type行替换为:keymapping.Type=newtypereference(inspector.Type.genericalarguments.First());
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;
            }
        }
    }
}