7 Stimmen

NHibernate, SQL Server - Zuordnung von enum zu int

Ich habe eine Klasse, die einen Enum-Typ hat, der angibt, ob der Nachrichtentyp E-Mail oder SMS ist. Der Enum-Typ ist definiert:

public enum ReminderType
{
    Email = 1,
    Sms = 2
}

Die Klasse, die diesen Typ verwendet, sieht wie folgt aus:

public class Reminder : EntityBase
{
    public virtual string Origin { get; set; }
    public virtual string Recipient { get; set; }
    public virtual ReminderType Type { get; set; }
    public virtual Business Business { get; set; }
    public virtual DateTime Created { get; set; }

    public Reminder()
    {
        Created = DateTime.UtcNow;
    }
}

Wenn ich versuche, eine Entität des Typs Erinnerung in der Datenbank aufrechtzuerhalten, erhalte ich jedoch den folgenden Fehler:

System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value 'Email' to data type int.

Das hintere Feld ist vom Typ int Ich bin mir also nicht sicher, warum NHibernate standardmäßig versucht, die String-Darstellung zuzuordnen. Ich verwende Fluent NHibernate, und der entsprechende Mapping-Code ist:

mappings.Override<Reminder>(map =>
{
     map.Map(x => x.Type).Column("Type")
});

Ich bin mir ziemlich sicher, dass das Standardverhalten von NHibernate Enums als Ints abbildet, warum tut es das in diesem Fall nicht? Ich verwende SQL Server 2005, falls das eine Rolle spielt.

5voto

Todd Punkte 1441

Ich mache das Gleiche und habe es so hinbekommen...

In meinem Fall ist EmployeeType die Enum-Klasse

 Map(x => x.EmployeeType, "EmployeeType_Id").CustomType(typeof (EmployeeType));

3voto

Chris Punkte 26827

Ich weiß nicht, warum diese Person immer wieder etwas postet und dann ihren Kommentar oder ihre Antwort löscht, aber der Link, den sie angegeben hat (), beantwortet meine Frage. Ich habe mich entschieden, nicht mit einem vollen Schlag Klassendefinition für die Konvention zu gehen, sondern eine Inline-Konvention in der Mappings-Code, wie so:

var mappings = AutoMap.AssemblyOf<Business>()
    .Where(x => x.IsSubclassOf(typeof(EntityBase)))
    .IgnoreBase(typeof(EntityBase))
    .Conventions.Add
    (
        ConventionBuilder.Id.Always(x => x.GeneratedBy.Identity()),
        ConventionBuilder.HasMany.Always(x => x.Cascade.All()),
        ConventionBuilder.Property.Always(x => x.Column(x.Property.Name)),
        Table.Is(o => Inflector.Pluralize(o.EntityType.Name)),
        PrimaryKey.Name.Is(o => "Id"),
        ForeignKey.EndsWith("Id"),
        DefaultLazy.Always(),
        DefaultCascade.All(),

        ConventionBuilder.Property.When(
            c => c.Expect(x => x.Property.PropertyType.IsEnum),
            x => x.CustomType(x.Property.PropertyType))
    );

Die letzte Anweisung des Convention Builders hat den Zweck erfüllt. Ich bin neugierig, warum Fluent NHibernate Standard ist, um Enums als Strings jetzt abbilden. Das scheint nicht viel Sinn zu machen.

0voto

Sly Punkte 14578

Sie sollten in NHibernate niemals Enum als int abbilden. Dies wird ein Grund für die Verwendung eines Updates für Geister .

Am besten ist es, einfach keine Typeigenschaft in XML-Mappings zu setzen. Um dies in Fluent NHibernate zu erreichen, können Sie Folgendes verwenden .CustomType(string.Empty) .

Einige zusätzliche Informationen finden Sie aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X