Entity Framework_2

CodeFirst,查询部分列(匿名类查询),Lambda查询,linq查询,线程唯一对象,

Entity Framework-2

CodeFirst

根据前面的DBFirst以及ModleFirst,我们也可以参照写出CodeFirst,Modle以ClassInfo(班级)和StudentInfo(学生)为例。在开始前请添加system.data.entity以及 两个 EF的引用

1
2
3
4
5
6
7
8
9
10
11
12
public class ClassInfo
{
[Key]
public int Id { get; set; }
[StringLength(32)]
[Required]
public string ClassName { get; set; }
[Required]
public DateTime RegeTime { get; set; }

public virtual ICollection<StudentInfo> StudentInfo { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class StudentInfo
{
[Key]
public int Id { get; set; }
[StringLength(32)]
[Required]
public string StudentName { get; set; }
[Required]
public DateTime StudenTime { get; set; }

public virtual ClassInfo ClassInfo { get; set; }

}

接下来是最重要的DbContext类,在添加之前要在config添加上连接字段

1
2
3
<connectionStrings>
<add providerName="System.Data.SqlClient" connectionString="server=.;uid=111;pwd=111~!~;database=DodeFirstDb"/>
</connectionStrings>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CodeFirstDbContext:DbContext
{
public CodeFirstDbContext():base("name=connSql")
{

}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除约束实体类型名称复数版本规则
}

public virtual DbSet<ClassInfo> ClassInfo { get; set; }
public virtual DbSet<StudentInfo> StudentInfo { get; set; }
}

接下来我们来试验下

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
CodeFirstDbContext db = new CodeFirstDbContext();
db.Database.CreateIfNotExists();//如果不存在数据库则创建
ClassInfo classInfo = new ClassInfo(){ClassName = "八班",RegeTime = DateTime.Now};
db.ClassInfo.Add(classInfo);
db.SaveChanges();
}

查询部分列(匿名类查询)

查询部分列其实也就在查询的地方用匿名类代替

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)
{
CodeFirstDbContext db = new CodeFirstDbContext();
var CodeFirstList = from c in db.ClassInfo
where c.Id == 1
select new { ClassName = c.ClassName, Rtime = c.RegeTime };
foreach (var VARIABLE in CodeFirstList)
{
Console.WriteLine(VARIABLE.ClassName);
}
}

Lambda查询

上面我们使用的是linq查询,但是使用lambda查询会更为简便,Iqueryable中提供了一个扩展方法where,可以使用方法或者lambda去查询

1
2
3
4
5
6
7
8
9
protected void Button9_Click(object sender, EventArgs e)
{
EfFirstModleEntities db = new EfFirstModleEntities();
var UserInfoList = db.UserInfo.Where(u => u.Id == 1);//返回的是bool值
foreach (UserInfo userInfo in UserInfoList)
{
Response.Write(userInfo.UserName);
}
}

排序查询

1
2
3
4
5
6
7
8
9
10
protected void Button9_Click(object sender, EventArgs e)
{
EfFirstModleEntities db = new EfFirstModleEntities();
var UserInfoList = db.UserInfo.Where(u => true).OrderBy<UserInfo, Int32>(u => u.Id);//查询全部,根据Id升序排列
//var UserInfoList = db.UserInfo.Where(u => true).OrderByDescending(U => U.Id);//查询全部,根据Id降序序排列
foreach (UserInfo userInfo in UserInfoList)
{
Response.Write(userInfo.UserName);
}
}

返回结果

1
kju117 kju127 kju137 kju147 kju157 kju167

使用linq排序

1
2
3
4
var userInfoList2 = from u in db.UserInfo
orderby u.Id descending
where u.Id > 0
select u;
分页查询
1
2
3
4
5
6
7
8
9
10
11
protected void Button9_Click(object sender, EventArgs e)
{
EfFirstModleEntities db = new EfFirstModleEntities();
int pageIndex = 2;//当前页码
int pageSzie = 2;//每页总共的数据
var userInfoList3 = db.UserInfo.Where(u => true).OrderBy(u => u.Id).Skip((pageIndex-1)*2).Take(pageSzie);//跳过两条,取两条
foreach (UserInfo userInfo in userInfoList3)
{
Response.Write(userInfo.UserName);
}
}

返回结果是,kju137 kju147

linq写法

1
2
3
4
var userInfoList2 = (from u in db.UserInfo
orderby u.Id
where u.Id > 0
select u).Skip(2).Take(2);

EF实例创建的问题

到目前为止,我们创建EF都是直接New出来,但是这样会带来一个问题。假如现在我们有一个EF1从数据库里面拿到了数据,但是没有执行saveChanege,这时候另一个EF2也从数据库里面拿到了数据更改完毕后立刻savechange,那么这时候的EF1的数据是旧数据,这时候单利模式,有弊端,占用内存大,要是释放内存会把别人的内存也释放掉。解决办法是使用线程唯一对象,但是后面我们不用这种封装

1
2
3
4
5
6
7
8
9
Model2Container db = null;
if (HttpContext.Current.Items["db"]==null)
{
db = new Model2Container();
}
else
{
db = HttpContext.Current.Items["db"] as Model2Container;
}

C9DZqI.png


Entity Framework_2
http://www.kju147.com/2018/04/15/Entity-Framework-2/
作者
个人学习
发布于
2018年4月15日
许可协议