用一天时间学数据库,其实就是把书本上第12章代码敲一遍
下面是按照课本的步骤,先建数据库,再建实体数据模型
- 第一步,新建基于服务的数据库
- 第二步,新建表
- 第三步,建实体数据模型,基于数据库的
- 最后,使用 LINQ to Entities 访问实体对象(创建实例,查询,增添,删除)
- 下面是
MainWindow.xaml.cs
代码:
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Data;
namespace DatabaseFirstExample
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
//创建一个实体框架上下文实例
private MyDbEntities context7 = new MyDbEntities(); //此处为何不能用var
public MainWindow()
{
InitializeComponent();
this.Loaded += Example04_Loaded;
this.Loaded += Example05_Loaded;
this.Unloaded += Example07_Unloaded;
ShowResult();
ShowResult8(); //作用是刷新一下显示出的数据库
//使用Load方法加载对象
using (var context = new MyDbEntities())
{
var q = from t in context.Student
where t.ChengJi >= 60
select new
{
学号 = t.XueHao,
姓名 = t.XingMing,
性别 = t.XingBie,
成绩 = t.ChengJi
};
dataGrid1.ItemsSource = q.ToList();
}
//显示学号、姓名及其家庭成员信息
using (var context = new MyDbEntities())
{
var q = from t1 in context.Student
from t2 in context.FamilyInfo
where t1.XueHao == t2.XueHao
select new
{
学号 = t1.XueHao,
姓名 = t1.XingMing,
家庭成员姓名 = t2.XingMing,
家庭成员性别 = t2.XingBie,
与本人关系 = t2.GuanXi
}; //end
dataGrid4.ItemsSource = q.ToList();
}
}
//利用LINQ to Entities查询多个对象
void Example04_Loaded(object sender, RoutedEventArgs e)
{
//显示学生信息
using(var context = new MyDbEntities())
{
var q = from t1 in context.Student
from t2 in context.XueYuan
where t1.XueYuanID == t2.XueYuanID
select new
{
学号 = t1.XueHao,
姓名 = t1.XingMing,
性别 = t1.XingBie,
学院 = t2.XueYuanMingCheng,
成绩 = t1.ChengJi
}; //语句的结束
dataGrid2.ItemsSource = q.ToList();
}
}
void Example05_Loaded(object sender, RoutedEventArgs e)
{
//统计所有姓王的学生人数以及这些学生的合计成绩
using(var context = new MyDbEntities())
{
var q = from t in context.Student
where t.XingMing.StartsWith("王") == true
select t.ChengJi; //结束
txtResult.Text = string.Format("姓王的人数:{0},合计成绩:{1}", q.Count(), q.Sum()); //很简洁
var q2 = from t2 in context.Student
select new
{
学号 = t2.XueHao,
姓名 = t2.XingMing,
成绩 = t2.ChengJi
}; //end
dataGrid3.ItemsSource = q2.ToList();
}
}
//使用实体框架和LINQ to Entities修改数据,先查询,修改后调用实体对象上下文的SaveChanges方法保存修改
void Example07_Unloaded(object sender, RoutedEventArgs e)
{
context7.Dispose(); //释放该实例
}
private void btn_Click(object sender, RoutedEventArgs e)
{
Button btn = e.Source as Button; //?点击按钮时使用该事件的按钮对象?
if(btn.Content.ToString() == "use LINQ change")
{
var q = from t in context7.Student
where t.XingMing == "张三鱼" //该不该用equals?
select t;
foreach(var v in q)
{
v.ChengJi += 1;
}
int i = context7.SaveChanges(); //返回值是修改的次数?
txtInfo.Text = "使用LINQ修改了" + i + "条记录";
ShowResult();
}
else if(btn.Content.ToString() == "use SQL change")
{
var db = context7.Database;
try
{
int i = db.ExecuteSqlCommand(
"update Student set ChengJi = ChengJi - 1 where XingMing = {0}", "张三鱼");
txtInfo.Text = "使用SQL修改了" + i + "条记录";
ShowResult();
}
catch (Exception ex)
{
MessageBox.Show("On failure:" + ex.Message);
}
}
}
private void ShowResult()
{
//由于SQL直接更改数据库,不修改实体上下文
//所以必须获取新的实体上下文实例才能得到最新的数据
if (context7 != null)
{
context7.Dispose();
context7 = new MyDbEntities();
}
var q = from t in context7.Student
where t.XingMing == "张三鱼"
select new
{
姓名 = t.XingMing,
成绩 = t.ChengJi
}; //end
dataGrid5.ItemsSource = q.ToList();
}
private void btn_Click8(object sender, RoutedEventArgs e)
{
string s = (e.Source as Button).Content.ToString(); //原理相同
if(s == "添加数据")
{
using (var context = new MyDbEntities())
{
Student student = new Student()
{
XueHao = "06001001",
XingMing = "胡启",
XingBie = "男",
XueYuanID = "01",
ChengJi = 77
};
try
{
context.Student.Add(student); //添加数据
context.SaveChanges(); //每次对数据库更改后?使用该方法?
}
catch (Exception ex)
{
MessageBox.Show("添加失败:" + ex.Message);
}
ShowResult8();
}
}
else if(s == "删除数据")
{
using (var context = new MyDbEntities())
{
var q = from t in context.Student
where t.XueHao == "06001001"
select t;
foreach(var v in q)
{
try
{
context.Student.Remove(v); //删除数据
}
catch (Exception ex)
{
MessageBox.Show("删除失败:" + ex.Message);
}
}
context.SaveChanges();
ShowResult8();
}
}
}
private void ShowResult8()
{
using (var context = new MyDbEntities())
{
var q = from t in context.Student
select new
{
学号 = t.XueHao,
姓名 = t.XingMing,
成绩 = t.ChengJi
}; //end
dataGrid6.ItemsSource = q.ToList();
}
}
}
}
- 下面是
MainWindow.xaml
代码:
<Window x:Class="DatabaseFirstExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<TextBlock Text="Output the information of student which grade >= 60"/>
<DataGrid Name="dataGrid1" AutoGenerateColumns="True"/>
<DataGrid Name="dataGrid2" AutoGenerateColumns="True"/>
<TextBlock Name="txtResult"/>
<DataGrid Name="dataGrid3" AutoGenerateColumns="True"/>
<DataGrid Name="dataGrid4" AutoGenerateColumns="True"/>
<DataGrid Name="dataGrid5"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Width="100" Margin="10" Content="use LINQ change" Click="btn_Click"/>
<Button Width="100" Margin="10" Content="use SQL change" Click="btn_Click"/>
</StackPanel>
<TextBlock Name="txtInfo"/>
<TextBlock Text="结果:"/>
<DataGrid Name="dataGrid6"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Width="100" Margin="10" Content="添加数据" Click="btn_Click8"/>
<Button Width="100" Margin="10" Content="删除数据" Click="btn_Click8"/>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
</Window>