Fehler-speichern Bild in SQL CE 4.0 mit ASP.NET MVC 3, Entity-Framework 4.1 Code Erste
Ich versuche zu speichern ein Bild in einer SQL Compact Edition (CE) - Datenbank.
Ich erkläre das Feld in meinem Studenten-Modell als:
[Column(TypeName = "image")]
public byte[] Photo { get; set; }
Die Datenbank ist erstellt mit dem image-Datentyp für die Spalte Photo wie man hier sehen kann:
Das problem ist:
Wenn ich die app starte und versuchen, speichern Sie ein Student mit einem Foto von 3 MB (zum Beispiel), bekomme ich eine exception:
validationError.ErrorMessage = "The field Photo must be a string or array type
with a maximum length of '4000'."
SQL Server CE unterstützt diese Datentypen. In diesem Vergleich zwischen SQL-Express und SQL Compact Edition (CE) haben wir, die SQL CE unterstützt Binäre (BLOB) - Speicherung durch die Verwendung von Bild-Daten geben.
Bild = Binärdaten Variabler Länge
mit einer maximalen Länge von 2^30-1
(1,073,741,823) bytes. Lagerung ist die
Länge des Wertes in bytes.
Bild sollte den job tun, denke ich.
Was mache ich hier falsch? Ist das ein bug?
Hinweis:
Ich habe auch versucht, das MaxLength-Daten Anmerkung:
[Column(TypeName = "image")]
[MaxLength(int.MaxValue)]
public byte[] Photo { get; set; }
aber ich bekomme diese exception:
Binary column with MaxLength greater than 8000 is not supported.
Edit:
Fand ich die post über die Freisetzung von EF 4.1. Es hat folgenden Wortlaut:
Ändern der Standard-Länge für nicht-Schlüssel
string und binary-Spalten, die von '128'
zu 'Max'. SQL Compact nicht unterstützt
'Max' Spalten, beim laufen gegen
SQL Compact einen zusätzlichen Code First
Konvention legen Sie eine Standard-Länge
4000. Es gibt mehr details über
der Wechsel in einen aktuellen blog
post (link unten).
Gut gut gut... der einzige Weg, ich könnte es tätig war, zu tun, was beschrieben wird hier, das heißt, indem DbContext.Configuration.ValidateOnSaveEnabled = false
. Dies ist ein workaround, als der Beitrag vermuten lässt.
- wie groß ist dein Bild ?
- es ist 3 MB.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die dieses problem Auftritt, Erik Ejlskov Jensen geschrieben eine funktionierende Konsole-Anwendung der zeigt, dass die Problemumgehung für dieses Problem. Wie der OP bereits erwähnt, ist ein wichtiger Teil der Antwort ist:
Eine bessere Lösung gefunden wurde. Nicht die überprüfung deaktivieren.
[Updates aus dem blog-Beitrag]
UPDATE: @DamienGuard, of LINQ to SQL and EF Code First fame, pointed out that a better and more provider agnostic solution is to use MaxLength rather than TypeName = “ntext”.
UPDATE 2: Using [MaxLength] prevents any validation errors, and disabling validation is not required.
ValidateOnSaveEnabled = false
.modelBuilder.ComplexType<ImageData>().Property(data => data.Content).HasColumnType("image");
ich habe mit Visual Studio Server-Explorer und die Spalte erzeugt, in der DB hat das DataType=Bild und Länge=1073741823, aber das speichern fehlschlägt mit dem gleichen Fehler aus der Frage. HinzufügenConfiguration.ValidateOnSaveEnabled = false;
nicht helfen, entweder. Haben Sie weitere Tipps für mich?Dem Weg, um anzugeben, dass keine maximale Länge mit der MaxLength-Daten-annotation, um keinen Maximalwert. Zum Beispiel:
Die SQL Compact-Anbieter ordnen Sie dann die Eigenschaft "Bild" - und EF-Validierung erkennt, dass es keine Maximallänge angegeben haben und somit nicht deaktiviert werden müssen. Wenn Sie wollen explizit über Zuordnung zu einer "Bild" - Spalte, können Sie dies tun:
produzieren das gleiche Ergebnis bei der Verwendung von SQL Compact.
Ich weiß, das ist zu spät, aber es könnte profitieren, andere Programmierer.
Könnte man hinzufügen, um die Kontext - Klasse in den OnModelCreating(DbModelBuilder modelBuilder) Methode