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; } }

 

此文僅作學習中的記錄,希望對看到此文的同學有一點點的幫助。

文中如果有不正確的地方歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM