Jeśli taką klasę:
1: public enum Gender
2: {
3: Male = 1,
4: Female,
5: }
6:
7: public class User
8: {
9: public virtual int Id { get; set; }
10: public virtual string UserName { get; set; }
11: public virtual Gender Gender { get; set; }
12: }
13:
zmapujemy całkowicie standardowo:
1: public class UserMap : ClassMap<User>
2: {
3: public UserMap()
4: {
5: Id(x => x.Id);
6: Map(x => x.UserName);
7: Map(x => x.Gender);
8: }
9: }
to w bazie zobaczymy wartości enuma Gender:
INSERT INTO Users (UserName, Gender) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'username', @p1 = 'Male'
W wielu przypadkach może być to zjawisko pożądane, ale czasami może chodzić nam o coś innego. To "czasami" odnosi się na przykład do sytuacji, w której mamy osobną tabelę "Genders" z dwoma wartościami: 1|Male, 2|Female. Wówczas w tabeli Users chcielibyśmy mieć również 1 i 2, a nie tekstowe odpowiedniki.
Rozwiązanie jest banalne, wystarczy że zmodyfikujemy mapowanie wykorzystując metodę CustomType<T>():
1: public class UserMap : ClassMap<User>
2: {
3: public UserMap()
4: {
5: Id(x => x.Id);
6: Map(x => x.UserName);
7: Map(x => x.Gender).CustomType<Gender>();
8: }
9: }
Efekt:
INSERT INTO Users (UserName, Gender) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'username', @p1 = 1
Minitip, ale kilka chwil kiedyś na to straciłem.