乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Entity Framework多對(duì)多關(guān)聯(lián)映射的實(shí)現(xiàn)

       ThinkTank_引擎 2014-04-07

      Entity Framework是微軟官方提供的一個(gè)ORM解決方案,它有純正的血統(tǒng),比NHibernate更容易使用并且與現(xiàn)有其它官方框架配合更加密切。

      時(shí)代不斷的在發(fā)展變化,記得10年前還是ADO(配合ASP)的天下,后來微軟推出了ADO.NET,再后來推出了ADO.NET Entity Framework,可見微軟在.NET與數(shù)據(jù)庫(kù)交互領(lǐng)域的作為。

      下面我將以Entity Framework(簡(jiǎn)稱EF)來演示一下在C#當(dāng)中如何使用好這個(gè)非常“爽”的ORM工具。我們以大家比較熟悉的模型—學(xué)生和課程的多對(duì)多的關(guān)系(學(xué)生可以選擇多門課程、課程有可能有多個(gè)學(xué)生選擇)來進(jìn)行演示。

      第一步,建立一個(gè)控制臺(tái)應(yīng)用程序,起名為CodeFirstEF。我們簡(jiǎn)單一點(diǎn),盡量不參雜到其它技術(shù)來進(jìn)行演示,將學(xué)習(xí)難度降低到最低。

      建立一個(gè)控制臺(tái)應(yīng)用程序沒有什么好說的,這里想簡(jiǎn)單的提一下,使用EF有3種常用的模型,Database-First(數(shù)據(jù)庫(kù)優(yōu)先)、Model-First(模型優(yōu)先)、Code-First(代碼優(yōu)先)。其中前兩種,數(shù)據(jù)庫(kù)優(yōu)先和模型優(yōu)先是比較簡(jiǎn)單的兩種模型??梢灾苯油ㄟ^VS工具連接數(shù)據(jù)庫(kù)自動(dòng)生成與數(shù)據(jù)庫(kù)交互的DbContext對(duì)象,這種模式有點(diǎn)像我們老早用過的不寫一行代碼就能自動(dòng)綁定GridView一樣(雖然有點(diǎn)夸張),雖然極大的提高了使用效率,但是靈活度欠缺。因此這篇博客,主要演示代碼優(yōu)先模型,所以起名為CodeFirstEF。

      第二步,在CodeFirstEF中建立一個(gè)文件夾Entity,里面放置兩個(gè)模型實(shí)體(學(xué)生和課程):

      1. namespace CodeFirstEF.Entity  
      2. {  
      3.     public enum Gender { Female, Male }  
      4.   
      5.     public class Student  
      6.     {  
      7.         [Key]  
      8.         [DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]  
      9.         public int StudentId { get; set; }  
      10.         public string StudentName { get; set; }  
      11.         public Gender Gender { get; set; }  
      12.         public DateTime? BirthDay { get; set; }  
      13.   
      14.         public virtual ICollection<Subject> Subjects { get; set; }  
      15.     }  
      16. }  
      學(xué)生類上面有個(gè)枚舉,用以區(qū)別性別。

      1. namespace CodeFirstEF.Entity  
      2. {  
      3.     public class Subject  
      4.     {  
      5.         [Key]  
      6.         [DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]  
      7.         public int SubjectId { get; set; }  
      8.         public string SubjectName { get; set; }  
      9.   
      10.         public virtual ICollection<Student> Students { get; set; }  
      11.     }  
      12. }  
      課程和學(xué)生類中都有兩個(gè)虛屬性,分別表示學(xué)生的課程以及課程有哪些學(xué)生。

      第三步,添加EntityFramework支持。

      兩個(gè)Entity建好了,下面關(guān)鍵的要添加對(duì)EF的引用,這里介紹一個(gè)強(qiáng)大的工具NuGet程序包。我們右鍵點(diǎn)擊控制臺(tái)項(xiàng)目CodeFirstEF,選擇管理NuGet程序包,打開下列彈出界面,選擇聯(lián)機(jī),找到EntityFramework。


      選擇安裝EntityFramework。


      下載好EntityFramework會(huì)彈出窗口。


      選擇我接受,很快就會(huì)裝好,裝好后如下所示。


      點(diǎn)擊關(guān)閉。這時(shí)我們已經(jīng)為我們的項(xiàng)目添加了EntityFramework支持,可以看到版本號(hào)為6,這是目前的最新版本。

      第四步,在CodeFirstEF控制臺(tái)項(xiàng)目下建立一個(gè)文件夾DAL,并創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)操作類DataContext。

      1. namespace CodeFirstEF.DAL  
      2. {  
      3.     public class DataContext : DbContext  
      4.     {  
      5.         public DataContext(string connectionName) : base(connectionName) { }  
      6.   
      7.         public DbSet<Student> Students { get; set; }  
      8.         public DbSet<Subject> Subjects { get; set; }  
      9.     }  
      10. }  
      它繼承自DbContext,需要引用命名空間 using System.Data.Entity。構(gòu)造函數(shù)DbContext有一個(gè)參數(shù)connectionName,它是用于連接數(shù)據(jù)庫(kù)的名稱。這時(shí)我們切換到App.Config配置文件下,添加connectionStrings節(jié)點(diǎn)配置,將數(shù)據(jù)庫(kù)連接的配置添加進(jìn)去。

      1. <?xml version="1.0" encoding="utf-8"?>  
      2. <configuration>  
      3.   <configSections>  
      4.     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->  
      5.     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  
      6.   </configSections>  
      7.   <connectionStrings>  
      8.     <add name="codeFirstDb" connectionString="Data Source=.;uid=sa;pwd=123456;Database=CodeFirstDb;" providerName="System.Data.SqlClient"/>  
      9.   </connectionStrings>  
      10.   <startup>  
      11.     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
      12.   </startup>  
      13.   <entityFramework>  
      14.     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />  
      15.     <providers>  
      16.       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />  
      17.     </providers>  
      18.   </entityFramework>  
      19. </configuration>  
      可以看到里面的codeFirstDb。

      好了,這時(shí)候讓我們看一下整個(gè)項(xiàng)目的結(jié)構(gòu)。


      第五步,在Program.cs的Main方法中寫入測(cè)試代碼。

      1. namespace CodeFirstEF  
      2. {  
      3.     class Program  
      4.     {  
      5.         static void Main(string[] args)  
      6.         {  
      7.             using (var db = new DataContext("codeFirstDb"))  
      8.             {  
      9.                 //添加學(xué)生guwei4037  
      10.                 if (!db.Students.Any(x => x.StudentName == "guwei4037"))  
      11.                 {  
      12.                     db.Students.Add(new Student()  
      13.                     {  
      14.                         StudentName = "guwei4037",  
      15.                         Gender = Gender.Male,  
      16.                         BirthDay = new DateTime(1984, 11, 25),  
      17.                     });  
      18.                 }  
      19.   
      20.                 //添加課程  
      21.                 if (!db.Subjects.Any(x => x.SubjectName == "English" || x.SubjectName == "Mathmatics" || x.SubjectName == "Computer"))  
      22.                 {  
      23.                     db.Subjects.AddRange(new Subject[]   
      24.                     {  
      25.                         new Subject()  
      26.                         {  
      27.                             SubjectName="English",  
      28.                         },  
      29.                         new Subject()  
      30.                         {  
      31.                             SubjectName="Mathmatics",  
      32.                         },  
      33.                         new Subject()  
      34.                         {  
      35.                             SubjectName="Computer",  
      36.                         }  
      37.                     });  
      38.                 }  
      39.   
      40.                 //找到guwei4037這個(gè)學(xué)生  
      41.                 Student student = db.Students.FirstOrDefault(x => x.StudentName == "guwei4037");  
      42.   
      43.                 //找到數(shù)學(xué)和英語這兩門課程  
      44.                 List<Subject> subjects = db.Subjects.Where(x => x.SubjectName == "Mathmatics" || x.SubjectName == "English").ToList();  
      45.   
      46.                 //給學(xué)生添加課程  
      47.                 foreach (Subject subject in subjects)  
      48.                 {  
      49.                     student.Subjects.Add(subject);  
      50.                 }  
      51.   
      52.                 //讓課程知道有哪些學(xué)生選擇了它  
      53.                 foreach (Subject subject in subjects)  
      54.                 {  
      55.                     subject.Students.Add(student);  
      56.                 }  
      57.   
      58.                 //刪除guwei4037這個(gè)學(xué)生其中的數(shù)學(xué)這門課程  
      59.                 student.Subjects.Remove(db.Subjects.FirstOrDefault(x => x.SubjectName == "Mathmatics"));  
      60.   
      61.                 //保存上述操作的結(jié)果  
      62.                 db.SaveChanges();  
      63.             }  
      64.         }  
      65.     }  
      66. }  
      很簡(jiǎn)單,注釋也很清晰。

      運(yùn)行一下整個(gè)控制臺(tái)項(xiàng)目,沒有報(bào)錯(cuò)說明程序運(yùn)行成功了。我們進(jìn)數(shù)據(jù)庫(kù)查看一下運(yùn)行的情況。

      這里我們也可以利用VS工具來查看,無須打開SQL Server。






      我們看到,EF替我們自動(dòng)創(chuàng)建了數(shù)據(jù)庫(kù)CodeFirstDb,并且為我們創(chuàng)建了一張中間表,而且將數(shù)據(jù)都插入到了相應(yīng)表中。

      怎么樣,EF相當(dāng)強(qiáng)大吧?而且非常簡(jiǎn)單好用,讓你寫代碼有非?!八钡母杏X。真正的面向?qū)ο缶幊叹褪沁@么簡(jiǎn)單,不用再學(xué)習(xí)額外的SQL編程了。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多