2014-09-17 3 views
1

Я работаю над тестовым проектом, чтобы узнать и понять C# и WPF. У меня есть кнопка, которая открывает окно проводника. Я хочу сохранить выбранный файл (изображение) в базу данных (SQL 2012) в столбце типа varbinary (max).Изображение не сохраняется в базе данных

И я не могу, обновленный «selectedCellphone» с изображением не сохраняется в БД. Во время отладки я заметил, что объект «saveCellphones» верен, атрибут «Фото» - это байт [] из изображения. И метод не вызывает никаких исключений.

private void importPhotoButton_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    OpenFileDialog ofd = new OpenFileDialog(); 
    ofd.Filter = "Bilddateien (*.png;*.jpeg)|*.png;*.jpeg|Alle Dateien (*.*)|*.*"; 
    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
    ofd.ShowDialog(); 

    byte[] data = System.IO.File.ReadAllBytes(ofd.FileName); 


    try 
    { 
     using (var context = new CellphoneManagerEntities()) 
     { 
      if (selectedCellphone != null) 
      { 
       selectedCellphone.Photo = data; 
       context.SaveChanges(); 
      } 
     } 
    } 
    catch (System.Data.Entity.Infrastructure.DbUpdateException ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 
+0

Где вы подключаете «selectedCellphone» в контексте? Должно быть что-то вроде «context.Cellphones.Add (selectedCellphone)». Вы вообще получаете какие-либо данные в базе данных? –

ответ

1

Что такое selectedCellPhone? Он не определен в коде, который вы публикуете.

I подозреваемый вы используете selectedCellphone в другом месте вашего кода, и это объект, который yuo извлек из вашей базы данных с использованием контекста.

Однако, когда вы звоните SaveChanges() по контексту, это, безусловно, другой контекст, от который вы использовали, чтобы получить свою selectedCellphone!

не имеет изменений для сохранения в контексте, который вы экономите:!

Для того, чтобы любые изменения сохранялись, вам необходимо внести изменения в контекст, который вы сохраняете.

Один из способов сделать это, если у вас нет оригинальный контекст доступен, будет что-то вроде этого:

using (var context = new CellphoneManagerEntities()) 
{ 
    var updateCellphone = context.CellPhones.FirstOrDefault(x => x.Id == selectedCellphone.Id); 
    if (updateCellphone != null) 
    { 
     updateCellphone.Photo = data; 
     context.SaveChanges(); 
    } 
} 

Кстати, вы извлекаете ваш byte[], даже если ничего не может быть сохранен. Если вы не используете его в другом месте, почему бы не переместить его внутри вас if:

updateCellphone.Photo = System.IO.File.ReadAllBytes(ofd.FileName); 
+0

Вы абсолютно правы. Я выбрал selectedCellphone в другом контексте. Это сработало сразу, когда я снова нашел его в этом новом контексте, как вы указали. Спасибо. –

+0

@JannisAlexakis: когда я вижу (также в своем собственном коде) что-то вроде «Я использую Linq, и эй, обновления не работают», _first_ мысль уже «давайте проверим и дважды проверим контекст». ** Контекст - это все ** :) – oerkelens

+0

Это плохая привычка от моих проектов Java: я всегда объявляю EntityManager как переменную класса, чтобы иметь одинаковый контекст сохранения во всем классе. –