Entity Framework(二)
1、 ORM :Object Relation Mapping ,通俗說:用操作對象的方式來操作數據庫。
2、 插入數據不再是執行Insert,而是類似於 Person p=new Person() ; p.Age=3;p.Name="wang" ;db.save(p);這樣的做法;
3、ORM工具有很多Dapper、PetPoco、NHibermate,首推Entity Framework
4、EF底層還是多ADO.Net的封裝.
5、使用EF進行數據庫開發的時候有兩個東西建立:建數據庫,建模型類。根據這兩種創建的先後順序有EF的三種創建方法:
(1) Database First(數據庫優先):先創建數據庫表,然後自動生成EDM文件,EDM文件生成模型類
(2)Model First (模型優先):先創建Edm文件,Edm文件自動生成模型類和數據庫;
(3)Code First(代碼優先):自己寫模型類,然後生成數據庫,沒有EDM。
6、EF安裝
(1)基礎階段用控制臺項目,使用Nuget安裝EntityFramework 會自動再APP‘config 中增加兩個EntityFramework相關的配置;
(2)在web.cong中配置鏈接字符串:
<connectionStrings> <add name="connstr" connectionString="Data Source=.; Initial Catalog=Test2; User Id=sa; Password=123; " providerName="System.Data.SqlClient" /> </connectionStrings>
7、 EF簡單DataAnnotations實體配置
(1)數據庫創建表:T_Persons,有Id(主鍵,自動增長) ,Name,CreateDateTime;
(2)創建Person類
[Table("T_Persons")] //因為和表名不一樣,所以要使用Table標註;public class Person { public long Id { get; set; } public string Name { get; set; } public DateTime CreateDateTime { get; set; } }
因為EF約定的主鍵是Id,所以不用再特殊指定Id為主鍵,如果非要指定就用[Key] .因為字段名和屬性名一樣,所以不用再特殊指定關系,如果需要[Column("Name")].
必填字段標註[Required]、字段長度[MaxLength(5)] 、可空字段 int? 、如果字段再數據庫中有默認值,則要再屬性上標註[DatabaeGenerated] 註意實體類要寫成public ,否則後面會有麻煩;
(3)創建 DbContext 類(模型類、實體類)
public class TestDbContext:DbContext { public TestDbContext():base("name=connstr")//name=connstr 表示使用連接字符串中名字為connstr的數據庫 { } public DbSet<Person> Persons { get; set; } }
(4)測試:
static void Main(string[] args) { using (TestDbContext ctx = new TestDbContext()) { Person p1 = new Person() { CreateDateTime = DateTime.Now, Name = "wang" }; ctx.Persons.Add(p1); ctx.SaveChanges(); } }
註意: MyDbConnect 對象是否需要using有爭議,不using也沒事,每次用的時候new MyDbConnect就行,不用共享同一實例,共享反而會有問題。saveChanges()才會更新到數據庫中。EF開發團隊都說要using,很多人不用,只是想利用LazyLoad而已,但是那樣做是違反分層的原則的。習慣用using
8、 EF模型的兩種配置方式:
EF中的模型類有兩種配置方式:DataAnnotations、FluentAPI兩種。上面這種在模型類上[Table"T_Person")]、[Column("Name")]這種方式就叫 DataAnnotations。這種方式方便,但是耦合度太高,一般的類最好是POCO(就是一個普通的類),不符合大項目開發的要求。微軟推薦使用FluentAPI,因此主要用FluentAPI
Entity Framework(二)