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.

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).


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; }
}

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.


Ja, NHibernate kann das spaltenspezifische verzögerte Laden sofort durchführen : ayende.com/blog/4377/nhibernate-new-feature-lazy-properties .
gabe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.