WPF MVVM+EF增删改查 简单示例(二) 1对1 映射

WPF MVVM+EF增删改查 简单示例(一)实现了对学生信息的管理。

现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料。并可对学生的图片资料进行更新。

添加了那些功能,先看看效果图:

第一步:添加实体类StudentPhotoEntity.cs

  public class StudentPhotoEntity
    {
        public int StudentId { get; set; }
        public byte[] StudentPhoto { get; set; }
        public virtual StudentEntity Student { get; set; }
    }

第二步:修改实体类StudentEntity.cs

  public class StudentEntity
    {
        public int StudentId { get; set; }
        public string StudentName { get; set; }
        public int StudentAge { get; set; }
        public int StudentSex { get; set; }
        public string StudentAddress { get; set; }
        public virtual StudentPhotoEntity StudentPhoto { get; set; }

    }

第三步:添加StudentPhotoEntityMapping.cs

  public class StudentPhotoEntityMapping : EntityTypeConfiguration<StudentPhotoEntity>
    {
        public StudentPhotoEntityMapping()
        {
            this.HasKey(t => t.StudentId);
            this.ToTable("StudentPhoto");
            this.Property(t => t.StudentPhoto).HasColumnName("StudentPhoto").HasColumnType(SqlDbType.Image.ToString()).IsRequired();
        }
    }

第四步:修改StudentEntityMapping.cs

  public class StudentEntityMapping : EntityTypeConfiguration<StudentEntity>
    {
        public StudentEntityMapping()
        {
            this.HasKey(t => t.StudentId);
            this.ToTable("Student");
            this.Property(t => t.StudentId).HasColumnName("StudentId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            this.Property(t => t.StudentName).HasColumnName("StudentName").HasColumnType(SqlDbType.NVarChar.ToString()).HasMaxLength(50).IsRequired();
            this.Property(t => t.StudentAge).HasColumnName("StudentAge").HasColumnType(SqlDbType.Int.ToString()).IsRequired();
            this.Property(t => t.StudentSex).HasColumnName("StudentSex").HasColumnType(SqlDbType.Int.ToString()).IsRequired();
            this.Property(t => t.StudentAddress).HasColumnName("StudentAddress").HasColumnType(SqlDbType.NVarChar.ToString()).HasMaxLength(200).IsRequired();

            this.HasRequired(t => t.StudentPhoto).WithRequiredPrincipal(i => i.Student);
            this.HasOptional(t => t.StudentPhoto).WithRequired(i => i.Student);
        }
    }

第五步:更新数据库

 1,将连接字符串修改为绝对路径
 2,打开“程序包管理器控制台”
 3,输入Add-Migration命令 回车
 4,输入Name 回车
 5,输入Update-Database 回车
 6,修改链接字符串


第六步:修改StudentControl.xaml在DataGrid中添加列

   <DataGridTemplateColumn Header="头像" Width="100" >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate  >
                            <Grid>
                                <Image Source="{Binding StudentPhoto.StudentPhoto,Converter={StaticResource convertImageAndByte}}" Stretch="Fill" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" ></Image>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

第七步:修改AddOrEditWindow.xaml添加图片输入控件

  <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" Margin="20,0,0,0">
            <Border BorderThickness="0.6" BorderBrush="Black">
                <Image x:Name="img" Width="70" Height="70" Stretch="Fill" Source="{Binding CurrentStudentEntity.StudentPhoto.StudentPhoto,Mode=TwoWay,Converter={StaticResource convertImageAndByte}}"></Image>
            </Border>
            <Button  Width="40" Height="20" VerticalAlignment="Bottom" Margin="10,0,0,0" Content="浏览" Click="Button_Click"> </Button>
        </StackPanel>

第八步:修改AddOrEditViewModel.cs中的Save()方法

 private void Save()
        {
            StudentEntity student = new StudentEntity()
            {
                StudentName = CurrentStudentEntity.StudentName,
                StudentAge = CurrentStudentEntity.StudentAge,
                StudentSex = IsChecked ? 0 : 1,
                StudentAddress = CurrentStudentEntity.StudentAddress,
                StudentPhoto = new StudentPhotoEntity()
                {
                   StudentPhoto = CurrentStudentEntity.StudentPhoto.StudentPhoto
                }
            };
            if (IsAdd)
            {
                StudentDal.Insert(student);
            }
            else
            {
                student.StudentId = CurrentStudentEntity.StudentId;
                student.StudentPhoto.StudentId = CurrentStudentEntity.StudentId;
                StudentDal.Update(student);
            }
        }

第九步:添加一个转换器类,实现图片与byte[]的相互转化

  [System.Windows.Data.ValueConversion(typeof(byte[]), typeof(ImageSource))]
    public class ConvertImageAndByte : System.Windows.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            byte[] binaryimagedata = value as byte[];
            if (binaryimagedata == null) return "";
            using (Stream imageStreamSource = new MemoryStream(binaryimagedata, false))
            {

                JpegBitmapDecoder jpeDecoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
                ImageSource imageSource = jpeDecoder.Frames[0];
                return imageSource;
            }

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return "";
            string path = value.ToString().Substring(8, value.ToString().Length - 8);
            System.Drawing.Bitmap bitmap;
            BitmapSource bmp = new BitmapImage(new Uri(path, UriKind.Absolute));
            using (MemoryStream outStream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();

                enc.Frames.Add(BitmapFrame.Create(bmp));
                enc.Save(outStream);
                bitmap = new System.Drawing.Bitmap(outStream);
            }
            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(bitmap);

            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            bm.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] imgBytes = stream.ToArray();
            stream.Close();

            return imgBytes;
        }
    }

此文仅作学习中的记录,希望对看到此文的同学有一点点的帮助。

文中如果有不正确的地方欢迎指正。

时间: 2024-10-06 11:39:02

WPF MVVM+EF增删改查 简单示例(二) 1对1 映射的相关文章

WPF MVVM+EF 增删该查 简单示例(一)

实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityFramework.SqlSreverCompact 第四步:在Entities文件夹下添加StudentEntity类 1 public class StudentEntity 2 { 3 public int StudentId { get; set; } 4 public string Stud

springboot+jpa+thymeleaf增删改查的示例(转)

这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上手最好.在网上找相关资料的时候总是很麻烦,有的文章写的挺不错的但是没有源代码,有的有源代码但是文章介绍又不是很清楚,所在找资料的时候稍微有点费劲.因此在我学习Spring Boot的时候,会写一些最简单基本的示例项目,一方面方便其它朋友以最快的方式去了解,一方面如果我的项目需要用到相关技术的时候,直

EF增删改查+使用Expression进行排序分页

注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (NorthwindEntities db=new NorthwindEntities()) { Customers cs2 = new Customers { CustomerID = "11", ContactName="aa4444sa", Address="

iOS sqlite 增删改查 简单封装(基于 FMDB)

/** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整体进行操作 * *  根据 model 对象自动建表,字段类型只支持 NSString , NSIteger , float * *  用到 runtime 运行时获取 model 属性 * */ 1 // 2 // AGDatabaseManager.h 3 // 4 // Created by

MVC3.0 EF增删改查的封装类

本人亲身使用EF CodeFirst,因为增删改查都是使用EF内置的一些方法,我想把它封装到一个类调用就行了.结合网上的资料和自己的整理,若有不对的地方望斧正,感激不尽.直接上代码吧.我就用新闻的增删改查做例子. 这是项目的整个结构图: Views文件夹的文件 1.先看Index.cshtml页面的代码把 Index.cshtml(列表页面) @model IEnumerable<NewsMvc.Models.News> @{ Layout = null; } <!DOCTYPE htm

安卓版php服务器的mysql数据库增删改查简单案例

index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html

JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)

前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就觉得应该快点完成下篇,要不然有点标题党的感觉,思及此,博主心有不安,于是加班赶出了下篇.如果你也打算用ko去做项目,且看看吧! 一.效果预览 其实也没啥效果,就是简单的增删改查,重点还是在代码上面,使用ko能够大量节省界面DOM数据绑定的操作.下面是整个整个增删改查逻辑的js代码: 页面效果: 二.

springboot&amp;mybatis 增删改查系列(二)

数据库篇 我的数据库名为data0525,数据表名为user,其中有五列uid,uname,upass,usex,umessage.uid为主键并且自动生成,由于是练习表,所以并没有考虑设计的合理性. 生产者篇 在我们已创建好的父项目中创建一个子项目. 依赖如下(注意:生产的的依赖需要写在生产者的pom文件中): <dependencies> <dependency> <groupId>org.springframework.boot</groupId> &

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码

上一讲我们创建了一系列的解决方案,我们通过一个例子来看看层与层之间的关系. 我们把Controllers分离出来了BLL层和DAL层 BLL专注于业务上的处理 DAL专注于数据访问层的处理 而Controller跟清楚的与View交互 我们上一讲已经在EF添加了一个实体SysSample 下面我们创建IDAL,DAL,IBLL,BLL的代码吧 using App.Models; using System.Linq; namespace App.IDAL { public interface IS