天天看點

ModelFirst的CRUD

建立實體:

ModelFirst的CRUD

建立上下文:

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打開的檔案:

ModelFirst的CRUD
ModelFirst的CRUD

第一個是表的定義。(存儲定義語言)  第二個:表實體的描述(概念模型)   第三個:映射關系

根據實體的狀态和映射關系生成相應的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圖解:

ModelFirst的CRUD