18

Bir resmi bir SQL Compact Edition (CE) veritabanında depolamaya/kaydetmeye çalışıyorum.Görüntüyü ASP.NET MVC 3 ve Entity Framework 4.1 ile SQL CE 4.0'da saklarken Hata İlk

ben olarak benim Öğrenci modelinde alanını beyan:

[Column(TypeName = "image")] 
public byte[] Photo { get; set; } 

burada görülebileceği gibi veritabanı Fotoğraf sütun için görüntü veri türü ile oluşturulur:

enter image description here

sorun:

Uygulamayı çalıştırdığımda ve 3 MB Fotoğraflı bir öğrenciyi kaydetmeyi denediğimde (örneğin), bir istisna alıyorum:

SQL Server CE, bu Data Types desteklemektedir. SQL Express ve SQL Compact Edition (CE) arasındaki bu comparison'da, bu SQL CE, görüntü veri türü kullanılarak İkili (BLOB) depolamayı destekliyor. 2^30-1 (1.073.741.823) bayt uzunluğu ile

Resim = Değişken uzunlukta ikili veri . Depolama, bayt cinsinden değerin uzunluğudur.

Görüntü, bence işi yapmalı.

Burada yanlış olan ne yapıyorum? Bu bir hata mı?

Not: Ben de MaxLength veri ek açıklama çalıştı

:

Binary column with MaxLength greater than 8000 is not supported. 

Düzenleme::

Ben post bulundu

[Column(TypeName = "image")] 
[MaxLength(int.MaxValue)] 
public byte[] Photo { get; set; } 

ama bu istisna olsun sürüm hakkında EF 4.1. ‘Max’ ‘128’ den anahtar olmayan dize ve ikili sütunlar için varsayılan uzunluğu

Değişikliği: Bu aşağıdaki sahiptir. SQL Compact 'Max' sütunları desteklemez, (linki varsayılan bir uzunluk 4000 değişikliği son blog yazı dahil hakkında daha fazla detay bulunmaktadır ayarlayacaktır SQL Compact karşı ek bir kod İlk kongre çalıştırırken'un altında).

Eh iyi iyi ... almak o çalışma tek yolu bu, DbContext.Configuration.ValidateOnSaveEnabled = false kuruyor, here açıklanan şeyi yapıyordum. Bu post önerileri gibi bir çözümdür.

+0

resminizin ne kadar büyük iç bağlam sınıfa ekleyebilir? –

+0

@Alexandre: 3 MB. –

cevap

18

Bu sorunu yaşayanlar için, Erik Ejlskov Jensen bu hataya yönelik geçici çözümü gösteren a working console application numaralı makaleyi yayınladı. OP'nin belirttiği gibi, cevabın önemli bir kısmı şu şekildedir:

public StudentContext() 
    { 
     // Required to prevent bug - http://stackoverflow.com/questions/5737733 
     this.Configuration.ValidateOnSaveEnabled = false;   
    } 

Daha iyi bir çözüm bulunmuştur. Doğrulamayı devre dışı bırakmayın. [blog yazısı güncellemeler] 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.

+1

Blog yazısı hakkında bana bilgi verdiğiniz için teşekkür ederiz. Erik'le bu hatayla karşılaştığımda daha fazla araştırma yapabilmem için iletişime geçtim. Bu soruya adanmış bir blog yayını görmek güzel. Benim de sorduğum gibi, bu sorunu çözmenin tek yolu 'ValidateOnSaveEnabled = false' ayarlanmasıdır. –

+0

Doğrulama'yı devre dışı bırakmanızı tavsiye ederim. MaxLength'u belirten cevabı çok daha iyi bir cevaptır. –

+1

Aslında, doğru cevap [MaxLength] özelliğini kullanmaktır, Blog mesajımı buna göre güncelledim – ErikEJ

12

MaxLength veri açıklama için kullanılan bir maksimum uzunluğunu belirlemek için bir yol bir maksimum değer sağlamaktır. Örneğin:

[MaxLength] 
public byte[] Photo { get; set; } 

SQL Compact sağlayıcı sonra belirtilen hiçbir maksimum uzunluğu olduğunu tanıyacak özelliğini "imaj" ve EF doğrulama ile eşler ve böylece devre dışı bırakılması gerekmez. Eğer bir "görüntü" sütununa eşleme konusunda açık olmak istiyorsanız o zaman bunu yapabilirsiniz: SQL Compact kullanırken aynı sonucu üretecektir

[Column(TypeName = "image")] 
[MaxLength] 
public byte[] Photo { get; set; } 

.

+2

Sadece ihtiyaç duyduğum şey, ayrıca [MaxLength] dizelerine uygulanan SQL Server CE –

+0

'da ntext (sınırsız uzunluk) sütunları oluşturuyor, sadece "MaxLength" kullanırsanız bir "Varsayılan değerler desteklenmiyor" istisnası alıyorum. Ve eğer [MaxLength (n)] kullanırsam, n 8000'den büyük olamaz? – smerlung

2

Bunun çok geç olduğunu biliyorum, ancak diğer programcılara faydası olabilir.

Sen OnModelCreating (DbModelBuilder ModelBuilder) yöntem

modelBuilder.Entity<EntityName>().Property(p => p.Photo).IsMaxLength();