2011-03-21 11 views
23

olarak geçmişte eşleştirmek için bu How do you map an enum as an int value with fluent NHibernate? kullanılan ama son zamanlarda NHibernate 3 geçiş yaptık ve bu artık işe görünmüyor. EnumConvention sınıfıma kesme noktaları koyuyorum ve vurulmuyorlar. Veritabanına isabet eden sorgu, enum varsayılan yapılandırma olan bir dize olarak sahiptir.Harita Enum Akıcı NHibernate ile Int ve NHibernate 3

NHibernate 3 ile bu nasıl çalışır? İşte

Güncelleme

oluşturulan eşleme dosyasının bir parçasıdır:

<property name="ComponentType" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[...ComponentType, ..., Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.1.0.0, Culture=neutral, PublicKeyToken=8aa435e3cb308880"> 
    <column name="ComponentTypeId" /> 
</property> 

bir IUserTypeConvention çeteleler için belirtilen zaman bir GenericEnumMapper kullanacağı konusunda hiçbir Doğru görünmüyor.

İşte benim konvansiyonudur:

public class EnumConvention : IUserTypeConvention 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(e => e.Property.PropertyType.IsEnum); 
    } 

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

Gerçekten bu egzersizden kazanmak için neye durduğunuzu görmüyorum ama bu durum bir sebepten dolayı kaldırılmış olabilir çünkü onlar bir şey bulamamışlardı. – Baz1nga

+0

artık çalışmıyor gibi görünüyor. Peki bu nasıl yapılabilir? 'Harita (...) .CustomType () Doing' çalışmaz. Sorunlara neden olur. Özel bir IUserType yapmayı deneyeceğim ve bunun şimdilik işe yarayıp yaramadığını göreceğim. –

+0

Enum yerine int olarak saklamak için herhangi bir neden var mı diyorsun? Mem nt bir prob gerçekten bir neden göremiyorum .. dize enums kod güvenli .. – Baz1nga

cevap

43

Basitçe Map(m => m.MyEnum).CustomType<MyEnum>() şimdi sadece iyi çalışıyor görünüyor yapıyor. IUserTypeConvention NHibernate 3'te Akıcı NHibernate ile çalışmıyor neden kimse bilir

, hala neden bilmek istiyorum. Belki de, özel türün enum ile eşleşmesi şu an çalışıyor, ama neden kütüphaneden kaldırılmadı?

+0

Basit çözüm ... bana hata ayıklama zamanını kurtardı! –

+0

Mükemmel çalıştı, teşekkürler! – vfilby

+0

Bu çözüm bir kongre tanımlamak çalışırken o benim için daha iyi çalıştı. Bir kuralı kullanarak, tür beklendiği gibi SQL Server 2014 tablosunda ayarlanmıyordu. – gopherr

0

Sen IUserTypeConvention adresinin kongre miras, ama FluentNHibernate.Conventions.UserTypeConvention dan:

Sorun burada anlatılan.

/// <summary> 
/// Convention: Boolean fields map to CHAR(1) T/F/Null 
/// </summary> 
public class BooleanTrueFalseConvention : FluentNHibernate.Conventions.UserTypeConvention<UserTrueFalseType> 
{ 
    /// <summary> 
    /// Accept field type criteria 
    /// </summary> 
    /// <param name="criteria"></param> 
    public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria) 
    { 
     criteria.Expect(instance => 
      instance.Property.PropertyType.Equals(typeof(System.Boolean)) 
      || 
      instance.Property.PropertyType.Equals(typeof(System.Nullable<System.Boolean>)) 
     ); 
    } 
} 

Bu NH 3.3 ve Fluent son sürümü ile çalışır:

Örneğin, bu benUserTrueFalseType adlı özel tipine boolean ve null boole eşleştirmek için kullanmak tam sözleşmedir.