2009-07-27 3 views
0

Unser "Benutzer" -Modell benötigt ein kleines Profilbild, und ich bin nicht ganz sicher, wie ich damit umgehen soll. Natürlich könnten wir es einfach in einem Ordner auf der Festplatte speichern und den Pfad/Dateinamen in der Datenbank speichern, aber ich denke, dass ich es lieber in der Datenbank selbst speichern möchte.Best Practices für Bilder in einem Modell mit Schloss ActiveRecord/MonoRail

Mein erster Gedanke war, eine Eigenschaft auf dem Modell wie diese haben:

[Property] 
public byte[] ProfilePicture 
{ 
    get; 
    set; 
} 

Aber es fühlt sich sicher wie ich einen langen Weg zu gehen zu haben, werde es auf diese Weise zu erhalten arbeiten - immer ein Byte-Array aus der Datenbank und konvertiert es dann in ein Bild mit einer Art Handler.

Hat jemand ein gutes Tutorial gesehen, wie man mit so etwas umgehen kann? Es scheint, als wäre es eine weit verbreitete Anforderung, dass ich etwas MonoRail-spezifisches finden würde, aber bis jetzt sind meine Suchen leer ausgegangen.

Antwort

1

Informationen zum Speichern von Bildern in Datenbanken oder Dateien finden Sie unter this question.

Wenn Sie es auf DB, das Wichtigste ist, zu speichern, entschieden, dass man nicht abrufen tun die byte[] jedes Mal, wenn Sie für einen Benutzer abfragen, das könnte eine Menge von Daten und ein perf Problem möglicherweise. Dazu müssen Sie das Bild in einer anderen Tabelle entweder speichern könnten oder die byte[] an ein anderes Unternehmen mit der gleichen Tabelle Karte (kann vorausgesetzt, der Benutzer nur ein Bild):

[ActiveRecord("users")] 
public class UserWithoutPicture { 
    [PrimaryKey] 
    public virtual int Id {get;set;} 
... 
    [BelongsTo] 
    public virtual UserProfilePicture ProfilePicture {get;set;} 
} 

[ActiveRecord("users")] 
public class UserProfilePicture { 
    [PrimaryKey] 
    public virtual int Id {get;set;} 

    [Property] 
    public virtual byte[] Image {get;set;} 
} 

Dies würde einige flippige Verhaltensweisen haben, obwohl . Für einen bestimmten Benutzer würde ProfilePicture niemals null sein. Sie würden UserProfilePicture nicht wirklich einfügen oder löschen, da es tatsächlich der Benutzer ist, stattdessen würden Sie immer aktualisieren. Und Sie würden eine zusätzliche Verbindung eingehen, und Sie müssen auf SELECT N+1 achten. Das ist nur von der Spitze meines Kopfes, vollständig nicht getestet.

Fazit: Speichern von Bildern in einer anderen Tabelle ist viel flexibler.

Wenn Sie den Komfort eines Image anstelle von byte[] wollen, implementieren Sie IUserType. Aber denken Sie daran, dass Image ein IDisposable ist, und es wird sehr hart sein, es zur richtigen Zeit zu entsorgen.

Die Implementierung einer Monorail-Steuerung, die ein Bild zurückgibt, ist ziemlich einfach ... einfach [ARFetch] verwenden, um die UserProfilePicture per ID zu erhalten und in den Response-Stream mit dem entsprechenden Inhaltstyp zu schreiben.