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图解:

浙公网安备 33010602011771号