ModelFirst的CRUD
创建实体:
创建上下文:
创建一个用户的实体:
UserInfo userInfo = new UserInfo(); userInfo.UName = "sunliyuan";
对实体进行添加操作:
dbContext.UserInfo.Add(userInfo);
添加两个订单:
OrderInfo order1 = new OrderInfo(); order1.Content = "shit1"; dbContext.OrderInfo.Add(order1); OrderInfo order2 = new OrderInfo(); order2.Content = "shit2"; dbContext.OrderInfo.Add(order2);
关联三个实体:(用户和订单一对多)
1.通过用户添加订单实体到自己的导航属性
userInfo.OrderInfo.Add(order1);
2.通过订单指定用户的实体:
order2.UserInfo = userInfo;
order2.UserInfoID = userInfo.ID;
把上面实体的变化封装成sql执行到数据库中:
dbContext.SaveChanges();
修改:
UserInfo userInfoEdit =new UserInfo();
userInfoEdit.ID = 1; userInfoEdit.UName = "Demo" + DateTime.Now; dbContext.Entry(userInfoEdit).State = EntityState.Modified;
//修改某个字段 dbContext.Entry(userInfoEdit).Property(u => u.UName).IsModified = true;
查询:(数据量小的时候使用Include)
IQueryable<UserInfo> temp = from u in dbContext.UserInfo.Include("OrderInfo") where u.UName.Contains("o") && u.UName.StartsWith("D") select u;
IQueryable<>==var 注:能连续写where条件 相当于拼结
两种延迟加载:
用到的时候就会去查询数据。把集合缓存起来 foreach (var userInfo in temp) { Console.WriteLine(userInfo.ID + " " +userInfo.UName); } foreach (var userInfo in temp) { Console.WriteLine(userInfo.ID + " " + userInfo.UName); } var temp2 = from u in temp where u.ID > 0 select u; //会组成一个SQL脚本 foreach (var userInfo in temp2) { Console.WriteLine(userInfo.ID + " " + userInfo.UName); }
第二种:延迟加载 导航属性 (数据量大时使用延迟加载)
foreach (var userInfo in temp)//100个用户数据。 101:跟后台交互的时间就比 一次连接表查询时间还要长。 { foreach (var orderInfo in userInfo.OrderInfo) { Console.WriteLine(userInfo.UName+ " " +orderInfo.ID + " " + orderInfo.Content); } }
大数据查询的方法:
1.把链接查询分解,转成单个大表的查询。最后在内存中组装数据
2.临时表(解决死锁的问题)
select * into #table from UserInfo 一个#代表临时表 两个## 代表全局临时表
EF的原理:
这是ModelFirst拿XML打开的文件:
第一个是表的定义。(存储定义语言) 第二个:表实体的描述(概念模型) 第三个:映射关系
根据实体的状态和映射关系生成相应的SQL脚本
Lambda表达式可以转换成Expression类型
Lambda语句转换不成Expression类型
Lambda 简单的查询:
var data = dbContext.UserInfo.Where(u => u.ID > 0); foreach (var userInfo in data) { Console.WriteLine(userInfo.ID + " " + userInfo.UName); }
Linq和Lambda性能有什么不同?
运行阶段一样 编译阶段有些不同
Linq--》Expression
Lambda---》Expression
分页:
var pagedata = dbcontext.userinfo .where(u => u.id > 0) //.orderby(u=>u.id)//升序 .orderbydescending<UserInfo,int>(u => u.id) //一页5条 取 3页 .skip(5 * (3 - 1)) .take(5); foreach (var userInfo in pageData) { }
查询部分列:
var demo = (from u in dbContext.UserInfo where u.ID > 0 orderby u.ID descending select u).Skip(10).Take(5); //Linq表达式 var data = from u in dbContext.UserInfo select new {MyUName=u.UName,u.ID,OrderCounts= u.OrderInfo.Count}; //Lambda var data = dbContext.UserInfo.Where(u => u.ID > 0) .Select(u => new {u.ID, MyUName = u.UName, OrderCounts = u.OrderInfo.Count}); foreach (var item in data) { Console.WriteLine(item.ID + " " + item.MyUName + " " + item.OrderCounts); }
CodeFirst模式:
public UserInfo() { OrderInfo =new HashSet<OrderInfo>(); } [Key] public int Id { get; set; } public string SName { get; set; } public int Age { get; set; } public string Email { get; set; } public virtual ICollection<OrderInfo> OrderInfo { get; set; }
public class OrderInfo { [Key] public int Id { get; set; } public string Content { get; set; } public virtual UserInfo UserInfo { get; set; } }
public class CodeFirstDbContext : DbContext { public CodeFirstDbContext() : base("name=DataModelContainer") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //throw new UnintentionalCodeFirstException(); } public DbSet<UserInfo> UserInfo { get; set; } public DbSet<OrderInfo> OrderInfo { get; set; } }
数据库配置:
<connectionStrings> <add name="DataModelContainer" connectionString="server=.;uid=sa;pwd=123;database=SunLiYuanCodeFirstDb;" providerName="System.Data.SqlClient"/> </connectionStrings>
支持MySql <add name="DataModelContainer" connectionString="server=127.0.0.1;
user id=root;password=123;persist security info=True;database=SunLiYuanCodeFirstDb;charset=utf8;" providerName="MySql.Data.MySqlClient" />
static void Main(string[] args) { using (CodeFirstDbContext dbContext = new CodeFirstDbContext()) { dbContext.Database.CreateIfNotExists(); UserInfo userInfo = new UserInfo(); userInfo.Age = 10; userInfo.Email = "ssss"; userInfo.SName = "ssss"; dbContext.UserInfo.Add(userInfo); dbContext.SaveChanges(); } Console.WriteLine("ok...."); Console.ReadKey(); }
EF图解: