Wie speichere ich Bilder mit Entity Framework Code First CTP 5?

83

Ich versuche nur herauszufinden, ob es eine einfache Möglichkeit gibt, Binärdaten (Datei) mit EF Code First CTP 5 zu speichern und abzurufen. Ich würde wirklich gerne den Typ FILESTREAM verwenden, aber ich suche wirklich nur nach einer Möglichkeit, damit es funktioniert.

Max Schmeling
quelle

Antworten:

41

Sie können SQL FILESTREAMin EF nicht verwenden . EF soll auf verschiedenen Datenbankservern arbeiten, aber die Filestream-Funktion ist eine spezifische Funktion von SQL 2008 und neuer. Sie können versuchen, es auf alte Weise zu tun - verwenden Sie es varbinary(max)in Ihrer Datenbanktabelle und verwenden Sie das Byte-Array in Ihrer zugeordneten Klasse.

Bearbeiten:

Kleine Klarstellung - Sie können FILESTREAMin der Datenbank verwenden, aber EF wird das Streaming nicht nutzen. Es wird standardmäßig geladen varbinary(max).

Ladislav Mrnka
quelle
112

Ich erstelle immer eine andere Klasse wie ProductImagebei einer Eins-zu-Eins-Zuordnung, um das verzögerte Laden zu verwalten und die Tabelle zu normalisieren:

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}
Nima
quelle
4
Wäre es nicht viel einfacher, eine Ansicht zu erstellen, die die Dateibildspalte nicht enthält, und dann eine zweite Entität in EF zu erstellen, die auf die Ansicht anstelle der Tabelle verweist - z. B. "ProductLite"
C.List
@ C.List Ich kann nicht glauben, dass ich EF seit Jahren benutze und nie daran gedacht habe. Es ist eine großartige Idee, und ich habe sie nur verwendet, um eine unnötige Ansicht loszuwerden, mit der ich das Gleiche getan habe. Nennen wir es eine "virtuelle Einheit" :)
Greg Gum
64

Deklarieren Sie einfach Ihr Eigentum als Byte [], wie Ladislav es erwähnt hat.

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

Das ist so ziemlich alles. Wenn Sie die Eigenschaft nicht zuordnen, wird sie gemäß der Konvention einem zugeordnet varbinary(max). Wenn Sie bereits eine [Column(TypeName = "image")]Bildspalte in der Datenbank haben, fügen Sie einfach die ProductImage-Eigenschaft hinzu, oder wenn Sie die Codezuordnung bevorzugen, fügen Sie diese Ihrer OnModelCreating-Überschreibung in der Kontextklasse hinzu:

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

Das Problem dabei ist, dass ich keinen Weg gefunden habe, die Eigenschaft faul zu machen, da ich nicht unbedingt jedes Mal Binärdaten laden möchte, wenn ich ein Produkt abrufe. Ich bin mir nicht sicher, ob ich mich richtig erinnere, aber NHibernate kann dies sofort tun.

Cosmin Onea
quelle
Ja, NHibernate kann das spaltenspezifische verzögerte Laden sofort durchführen : ayende.com/blog/4377/nhibernate-new-feature-lazy-properties .
gabe