建立實體:
建立上下文:
建立一個使用者的實體:
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圖解: