0

我在将图像转换为 Base64 字符串并将其作为字符串保存在数据库中时遇到问题,但它什么也不返回。Base64Text 是全局变量,变量也不为空我用按钮测试它来填充文本框,它只是保存为“”到数据库中。

这是数据库中表的模型

    public class Product
    {
        public int Id { get; set; }
        public string ProductName { get; set; }
        public double ProductPrice { get; set; }
        public int ProductAmount { get; set; }
        public string ProductImage { get; set; } // Used for storing image string
        public int userID { get; set; }
    }
// Here is image converter
        private void btnAddImage_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Image Files(*.BMP;*.JPG;*.PNG;*.JPEG)|*.BMP;*.JPG;*.PNG;*.JPEG" +
                "|All files(*.*)|*.*";
            dialog.CheckFileExists = true;
            dialog.Multiselect = false;
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                var image = new Bitmap(dialog.FileName);
                pictureBoxProductImage.Show();
                pictureBoxProductImage.Image = (Image)image;

                byte[] imageArray = System.IO.File.ReadAllBytes(dialog.FileName);
                base64Text = Convert.ToBase64String(imageArray);
            }
        }
// Here is saving image using Entity framework
        private void btnAddProduct_Click(object sender, EventArgs e)
        {
            string imagePath = base64Text;
            if (txtBoxProductName.Text == null || txtBoxProductPrice.Text == null || txtBoxProductQuantity.Text == null || imagePath == null || imagePath == "")
            {
                MessageBox.Show("Please fill required information!", "", MessageBoxButtons.OK);
            }
            else
            {
                model.ProductName = txtBoxProductName.Text;
                model.ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text);
                model.ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text);
                model.ProductImage = imagePath;
                model.userID = id;

                using (var context = new ProductContext())
                {
                    context.Products.Add(model);
                    context.SaveChanges();
                }
                MessageBox.Show("Product sucesffuly added to database!", "", MessageBoxButtons.OK);
                Clear();
            }
        }
4

1 回答 1

0

您看起来正在危险地混合变量范围。考虑到这段代码:

model.ProductName = txtBoxProductName.Text;
model.ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text);
model.ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text);
model.ProductImage = imagePath;
model.userID = id;

using (var context = new ProductContext())
{
    context.Products.Add(model);
    context.SaveChanges();
}

'model' 不在此方法的范围内。

我不建议将视图绑定到实体作为视图模型,而是使用普通的 C# ViewModel 类来避免混淆和有多个问题的实体。(属性更改跟踪、UI 验证行为等)

它应该看起来更像:

using (var context = new ProductContext())
{
    var product = new Product
    {
        UserId = id,
        ProductName = txtBoxProductName.Text,
        ProductPrice = Convert.ToDouble(txtBoxProductPrice.Text),
        ProductAmount = Convert.ToInt32(txtBoxProductQuantity.Text),
        ProductImage = hiddenImage.Text, // Something in the scope of the view storing the image Base64 content, not a global variable.
    };
    context.Products.Add(product);
    context.SaveChanges();
}

添加实体时,您要确保处理的是该实体的新实例,而不是引用。model可能是对上下文已经在跟踪的另一个实体的引用,这意味着当您认为要添加新行时,您最终可能会替换完全不同的记录上的值。此外,由于您正在确定一个新的 DbContext 实例的范围,因此来自该范围之外的任何实体引用都可能导致异常。

避免任何细节的全局变量。选择图像时,请确保 Base64 存储在应用页面或绑定视图模型范围内的某个位置。如果在这些更改之后仍然没有保存 ProductImage,那么我会查看 Entity 声明以确保它没有被标记为Ignore,并考虑使用探查器查看正在生成的 SQL 以确保包含该字段以及正在发送什么值。

于 2021-06-16T23:10:47.023 回答