2012-01-05 43 views
1

我有一个组合键实体,其中一个属性是一个int,另一个是枚举。枚举当前是按字符串映射的,但它需要是int。我有一个IUserTypeConvention已经这样做,但它不适用于组合键。如何使复合键枚举在流利的nhibernate中使用int与约定?

我有一个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); 
    } 

我只是无法弄清楚如何做到这一点的复合键。

谢谢!

回答

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

我不得不更换与此keymapping.Type行:keymapping.Type =新TypeReference(inspector.Type.GenericArguments.First()); – BradLaney 2012-01-05 22:38:06