免费男女视频_国产系列 视频二区_羞羞视频免费入口网站_久国久产久精永久网页_国产免费观看av_一区二区三区日韩在线观看

Entity Framework 5.0系列之数据操作

Entity Framework將概念模型中定義的實(shí)體和關(guān)系映射到數(shù)據(jù)源,利用實(shí)體框架可以將數(shù)據(jù)源返回的數(shù)據(jù)具體化為對象;跟蹤對象所做的更改;并發(fā)處理;將對象 更改傳播到數(shù)據(jù)源等。今天我們就一起討論如何利用Entity Framework進(jìn)行查詢、插入、更新和刪除數(shù)據(jù)。

查詢

我們將使用AdventureWorks數(shù)據(jù)庫來進(jìn)行今天的所有演示,因此開始之前請準(zhǔn)備好相應(yīng)的數(shù)據(jù)庫。在EF中進(jìn)行查詢應(yīng)該說是相當(dāng)簡單,只需 要定義一個(gè)類繼承于“DbContext”,然后定義對應(yīng)的“DbSet”集合屬性即可。例如下面的“AdventureWorksContext”類:

using System.Data.Entity; using System.Data.Entity.Infrastructure;  using EFPowerTools.Models.Mapping;  namespace EFPowerTools.Models 
{   public partial class AdventureWorksContext : DbContext 
    { static AdventureWorksContext() 
        { 
               Database.SetInitializer<AdventureWorksContext>(null); 
         }  public AdventureWorksContext() : base("Name=AdventureWorksContext") 
    { 
    }  public DbSet<Employee> Employees { get; set; }   public DbSet<Person> People { get; set; } 
     }
}

一個(gè)數(shù)據(jù)庫上下文的生命周期隨著該對象的創(chuàng)建而開始,隨著對象的釋放(或GC回收)而結(jié)束,因此建議在開發(fā)過程中使用“Using”編碼方式,這樣就可以免去手動釋放對象的操作。如下面的代碼:

using System; using System.Collections.Generic; using System.Linq; using System.Text;  using System.Threading.Tasks;  using EFPowerTools.Models; namespace EFPowerTools 
{   class Program { static void Main(string[] args) 
        {   using (var db = new AdventureWorksContext()) 
           {   var persons = db.People.Where(p => p.LastName == "Stevens").OrderBy(p=>p.FirstName); foreach(var p in persons) 
               { Console.WriteLine("FirstName:{0},LastName:{1}", p.FirstName, p.LastName); }
            }
         }
     }
 } 

 

另外對于數(shù)據(jù)庫連接的管理在EF中是透明的,我們一般不需要手動進(jìn)行處理,當(dāng)查詢一個(gè)對象時(shí)打開連接當(dāng)處理完查詢的結(jié)果集之后會自動關(guān)閉連接。

在EF的Code First模式中有三種常用的數(shù)據(jù)查詢方式(Model First和Database First中還有其他方式如:使用Entity SQL,但這不是我們今天的重點(diǎn)):Linq To Entity表達(dá)式查詢、基于方法的查詢、原生SQL查詢。

Linq To Entity表達(dá)式查詢

查詢表達(dá)式是C#3.0新增的功能,它是由一組類似于T-SQL或XQuery聲明性語句組成,CLR并不能直接讀取這種查詢表達(dá)式而是在編譯時(shí)轉(zhuǎn)換為對應(yīng)的方法調(diào)用。如下面的例子:

using System; using System.Collections.Generic;  using System.Data;  using System.Data.Entity.Validation; using System.Linq; using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models; namespace EFPowerTools 
{   class Program   { static void Main(string[] args) 
      { using (var db = new AdventureWorksContext()) 
          { var persons = from p in db.People where p.LastName == "Stevens" orderby p.FirstName select p; foreach (var p in persons) { Console.WriteLine("FirstName:{0},LastName:{1}", p.FirstName, p.LastName); }
          }
      }
   } 
} 

基于方法的查詢

基于方法的查詢事實(shí)上是一組對象的擴(kuò)展方法,同Linq查詢不同的是這些方法可以直接被CLR識別并運(yùn)行。

例如上面的方法我們可以轉(zhuǎn)換為如下代碼,他們的效果是一樣的,返回的都是“IQueryable”對象:

using System; using System.Collections.Generic;  using System.Data; using System.Data.Entity.Validation;  using System.Linq;  using System.Text; using System.Threading.Tasks; using EFPowerTools.Models; namespace EFPowerTools 
{   class Program { static void Main(string[] args) 
          { using (var db = new AdventureWorksContext()) 
               { var persons = db.People.Where(p => p.LastName == "Stevens").OrderBy(p => p.FirstName); foreach (var p in persons) { Console.WriteLine("FirstName:{0},LastName:{1}", p.FirstName, p.LastName); }
               }
          }
     }
} 

原生SQL查詢

EF還支持原生SQL查詢(注意與Entity SQL區(qū)別),例如:

using System; using System.Collections.Generic; using System.Data;  using System.Data.Entity.Validation;  using System.Linq; using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models;  using System.Data.Objects;  namespace EFPowerTools 
{   class Program { static void Main(string[] args) 
          {   using (var db = new AdventureWorksContext()) 
              { var persons = db.People.SqlQuery("SELECT * FROM Person.Person WHERE LastName='Stevens'"); foreach (var p in persons) { Console.WriteLine("FirstName:{0},LastName:{1}", p.FirstName, p.LastName); } 
              }
           }
      }
 } 

不僅如此,EF還支持非實(shí)體類型的查詢:

using System;  using System.Collections.Generic;  using System.Data;  using System.Data.Entity.Validation; using System.Linq;  using System.Text; using System.Threading.Tasks; using EFPowerTools.Models; using System.Data.Objects;  namespace EFPowerTools 
{   class Program { static void Main(string[] args) 
        {   using (var db = new AdventureWorksContext()) 
            { var persons = db.Database.SqlQuery<string>("SELECT FirstName FROM Person.Person WHERE LastName='Stevens'").ToList();   foreach (var p in persons) 
               { Console.WriteLine("FirstName:{0}", p); } 
            }
        }
     }
} 

當(dāng)然也支持無返回值的SQL命令:

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity.Validation; using System.Linq; using System.Text; using System.Threading.Tasks;  using EFPowerTools.Models;  using System.Data.Objects;  namespace EFPowerTools 
{ class Program { static void Main(string[] args) 
       { using (var db = new AdventureWorksContext()) 
           { 
                db.Database.ExecuteSqlCommand("UPDATE Person.Person SET NameStyle=1 WHERE BusinessEntityID='1813'"); 
           }
        }
     }
} 

增加

在EF中添加操作一般有兩種方式:一是直接創(chuàng)建對象,然后調(diào)用“DbSet”的”Add()”方法進(jìn)行添加;二是調(diào)用數(shù)據(jù)庫上下文的”Entry()”方法并設(shè)置對應(yīng)的狀態(tài)。無論使用哪種方式最終一定要調(diào)用“SaveChange()”進(jìn)行提交。如:

using System; using System.Collections.Generic; using System.Data;  using System.Data.Entity.Validation;  using System.Linq;  using System.Text;  using System.Threading.Tasks;  using EFPowerTools.Models;  namespace EFPowerTools 
{   class Program { static void Main(string[] args) 
          { using (var db = new AdventureWorksContext()) 
               { var stephen = new Person 
                   { 
                       BusinessEntityID=20778, PersonType="EM", NameStyle=false, Title="Architec", FirstName="Stephen", LastName="Chow", EmailPromotion=1, rowguid = Guid.NewGuid(), ModifiedDate = DateTime.Now
                    }; 
                       db.People.Add(stephen); var jeffrey = new Person 
                       { 
                       BusinessEntityID = 20779, PersonType = "EM", NameStyle = false, Title = "Engineer", FirstName = "Jeffrey", LastName = "Lee", EmailPromotion = 0, rowguid=Guid.NewGuid(), ModifiedDate=DateTime.Now 
                       };
                       db.Entry(jeffrey).State = EntityState.Added; db.SaveChanges();
               }
          }
     }
 } 

效果如圖:

此外,在含有導(dǎo)航屬性時(shí),將一個(gè)對象賦值給另一個(gè)對象的導(dǎo)航屬性也能達(dá)到添加的效果(當(dāng)導(dǎo)航屬性為”DbSet“集合時(shí)通過調(diào)用導(dǎo)航屬性的 “Add()“方法也同樣可以達(dá)到添加效果),例如在”Person.Person”中我們上面添加了兩條記錄,但對于“Person”類的導(dǎo)航屬性 “EmailAddress”和“Password”在對應(yīng)的“EmailAddress”表和“Password”表中并沒有添加對應(yīng)的記錄,此時(shí)我們 就可以通過下面的方式來增加:

using System; using System.Collections.Generic;  using System.Data;  using System.Data.Entity.Validation;  using System.Linq;  using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models;  namespace EFPowerTools
 { class Program   { static void Main(string[] args) 
          {   using (var db = new AdventureWorksContext()) 
            { var password = new Password 
                 { 
                      BusinessEntityID=20778, PasswordHash = "ZEgQH9qZIPiLgyBHYw/dD1FJQNpdQyIAa+BFfKX5/jg=", PasswordSalt = "7iy/umc=", rowguid=Guid.NewGuid(), ModifiedDate=DateTime.Now 
                  }; var email = new EmailAddress 
                 {
                      BusinessEntityID = 20778, 
                      EmailAddress1 = "[email protected]", 
                      rowguid = Guid.NewGuid(), 
                      ModifiedDate = DateTime.Now 
                 }; var person = db.People.Find(20778);
                 person.Password = password; person.EmailAddresses.Add(email); 
                 db.SaveChanges(); 
             } 
           }
      }
 } 

此時(shí)查看將可以看到“EmailAddress”表中確實(shí)增加了一條記錄(“Password”表同樣也是如此):

狀態(tài)跟蹤

在這里我們需要強(qiáng)調(diào)一點(diǎn)那就是狀態(tài)跟蹤,對于上面的操作如果我們調(diào)用“Attach()”方法對實(shí)體進(jìn)行跟蹤或者設(shè)置實(shí)體的狀態(tài)那么數(shù)據(jù)將不會保存到數(shù)據(jù)庫:

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity.Validation; using System.Linq;  using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models;  namespace EFPowerTools 
{   class Program   { static void Main(string[] args) 
        { using (var db = new AdventureWorksContext()) 
            { var stephen = new Person 
                 {
                     BusinessEntityID = 20778, PersonType = "EM", NameStyle = false, Title = "Architec", FirstName = "Stephen", LastName = "Chow", EmailPromotion = 1, rowguid = Guid.NewGuid(), ModifiedDate = DateTime.Now 
                  }; 
                 db.People.Add(stephen); db.People.Attach(stephen); //db.Entry(stephen).State = EntityState.Unchanged;/同上面db.People.Attach(stephen);作用一樣   db.SaveChanges(); 
            } 
        }
    }
} 

 

使用”Attach()”方法進(jìn)行實(shí)體跟蹤時(shí)會設(shè)置實(shí)體的狀態(tài)為“Unchanged”此時(shí)實(shí)體處于未修改狀態(tài),當(dāng)執(zhí)行 “SaveChange()”方法時(shí)EF不會執(zhí)行修改操作。相反如果此時(shí)設(shè)置實(shí)體狀態(tài)為“Modified”則EF執(zhí)行更新操作。那么既然EF的數(shù)據(jù)修改 操作(增加、更新、刪除)是根據(jù)實(shí)體狀態(tài)而進(jìn)行的,那么為什么之前我們的增加操作能正常進(jìn)行而不用手動修改其狀態(tài)呢?原因是EF會自動發(fā)現(xiàn)狀態(tài)改變,在調(diào) 用下面的方法時(shí)狀態(tài)發(fā)現(xiàn)是自動的:

· DbSet.Find

· DbSet.Local

· DbSet.Remove

· DbSet.Add

· DbSet.Attach

· DbContext.SaveChanges

· DbContext.GetValidationErrors

· DbContext.Entry

· DbChangeTracker.Entries

當(dāng)然,并不是所有的時(shí)候我們都需要EF自動發(fā)現(xiàn)狀態(tài)改變,設(shè)置 “DbContext.Configuration.AutoDetectChangesEnabled”屬性為“false”可以禁用自動發(fā)現(xiàn)功能。

注意:在EF對數(shù)據(jù)操作時(shí)有時(shí)會拋出:
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
此時(shí)可以使用try{} catch(DbEntityValidationException ex){} 對異常進(jìn)行捕獲,將鼠標(biāo)放到ex上并逐級查看ex的信息進(jìn)行解決。

刪除

下面看一下EF的刪除操作:

using System;  using System.Collections.Generic; using System.Data;  using System.Data.Entity.Validation;  using System.Linq; using System.Text; using System.Threading.Tasks; using EFPowerTools.Models; using System.Data.Objects;  namespace EFPowerTools 
{   class Program   { static void Main(string[] args) 
       { using (var db = new AdventureWorksContext()) 
           {   var mail = db.EmailAddresses.Where(m => m.EmailAddressID == 19977).FirstOrDefault(); db.EmailAddresses.Remove(mail); db.SaveChanges(); 
            }
        }
    }
 } 

當(dāng)然有了上面狀態(tài)跟蹤的討論相信大家也可以想到如下刪除方法:

using System;  using System.Collections.Generic; using System.Data; using System.Data.Entity.Validation; using System.Linq;  using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models; using System.Data.Objects; namespace EFPowerTools 
{ class Program   { static void Main(string[] args) 
      { using (var db = new AdventureWorksContext()) 
         {   var mail = db.EmailAddresses.Where(m => m.EmailAddressID == 19976).FirstOrDefault(); db.Entry(mail).State = EntityState.Deleted; db.SaveChanges(); 
         }
       }
    }
 } 

修改

修改數(shù)據(jù)很簡單,直接修改對應(yīng)的屬性即可:

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity.Validation;  using System.Linq; using System.Text;  using System.Threading.Tasks; using EFPowerTools.Models;  using System.Data.Objects; namespace EFPowerTools
 {   class Program   { static void Main(string[] args) 
        { using (var db = new AdventureWorksContext()) 
            { var person = db.People.Where(p => p.LastName == "Stevens").OrderBy(p=>p.BusinessEntityID).FirstOrDefault(); person.NameStyle = false; person.EmailAddresses.First().EmailAddress1 = "[email protected]"; db.SaveChanges();
             }
        }
     }
 } 

需要說明的是,EF在執(zhí)行修改操作前會檢查哪些屬性發(fā)生了變化,并且只會修改發(fā)生變化的字段。

今天的內(nèi)容就先到這里了,從前面的EF5.0概覽到現(xiàn)在的數(shù)據(jù)操作,關(guān)于EF5.0基礎(chǔ)的入門內(nèi)容已經(jīng)說完了,更多內(nèi)容敬請關(guān)注后面的文章。

1
2
3
4
5
6
7
8
9
- (void)configDelegate{
    __weaktypeof(self)weakSelf=self;
    [self.delegatesetSelectRowAtIndexPathBlock:^(idcell,NSIndexPath*indexPath) {
      TMPremiereBrand*premiereBrand= (TMPremiereBrand*)weakSelf.data[indexPath.row];
      TMSpecialTopicController*specialTopicController= [[TMSpecialTopicControlleralloc]init];
      specialTopicController.premiereBrandID=premiereBrand.ID;
      [weakSelf.navigationControllerpushViewController:specialTopicControlleranimated:YES];
    }];
}

主站蜘蛛池模板: 涩涩屋av| 日韩精品二区 | 久久金品 | 日韩视频观看 | 久久男 | 欧美一级高潮片免费的 | 久色伊人| 亚洲天堂在线电影 | 国产精品久久久久久久亚洲按摩 | 草久视频在线观看 | 午夜久久久精品一区二区三区 | 欧美女人天堂 | 亚洲国产精品久久久久久久久久 | 一级电影免费看 | 色999久久久精品人人澡69 | 免费看毛片的网站 | 日本在线播放一区二区三区 | 韩国19禁在线 | 青草久久av| 日韩视频在线一区二区三区 | 精品一区二区三区日本 | 国产精品久久久久无码av | 色综合精品 | 天天夜碰日日摸日日澡性色av | 精品久久久久久久久中文字幕 | 毛片免| 久久草在线看 | 精品亚洲在线 | 亚洲无马在线观看 | 99精品视频免费看 | 午夜精品成人一区二区 | 欧美性生交xxxxx免费观看 | av在线免费不卡 | 一级在线观看视频 | 国产一级91 | asian附近女人裸体pics | 国产成人在线一区 | 最新黄色毛片 | 91精品国产综合久久婷婷香蕉 | 欧美色淫 | 免看黄大片aa |