2012-01-05 31 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