我正在研究一个测试项目,以便学习和理解C#和WPF。我有一个打开资源管理器窗口的按钮。我想将所选文件(图像)保存到varbinary(max)类型的列中的数据库(SQL 2012)。
我失败了,带图像的更新“selectedCellphone”未保存到数据库中。在调试时,我注意到对象“saveCellphones”是正确的,属性“Photo”是图像中的byte []。并且该方法不会引发任何异常。
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 :(得分:1)
什么是selectedCellPhone
?它没有在您发布的代码中定义。
我怀疑您在代码中的其他位置使用selectedCellphone
,并且它是使用上下文从您的数据库中检索到的实体。
但是,当您在某个环境中调用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);