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