因為新公司的同事以前用過EF所以在我的項目裡面也要用這個,隨即上部落格園找了幾篇文章實驗了一下。我用的是VS2010正式版跑網上的代碼會報錯,這種事真是相當噁心人,要不是沒的選擇我肯定就放棄這個架構了。用微軟的東西無比噁心像EF這種核心必備架構也不弄穩定了就發行1、2、3版,結果到了4.0才剛剛支援POCO這種東西,好像剛出來的時候連從代碼建立資料庫都不支援。而且就算到了4.0它的CTP版本之間的api也不一樣,甚至連EF的程式集名字都變來變去的,微軟這幫人不是坑爹嘛。如果你也是第一次接觸EF請先去ADO.net team官方blog上面找EF的最新版本發布資訊。對於CTP5來說請點擊這個連結然後在裡面下載程式集並閱讀簡單的文檔。再發兩句牢騷,微軟出的這些架構就不能把它們都統一放在一個地方便於使用者搜尋下載嗎?類似於python的http://pypi.python.org/這樣的網站,每一次版本更新的說明和相關文檔都能方便的看到這樣做多人性。還有就是用模板產生實體的時候就報錯我真是無語了。
不廢話了簡單實驗一下,先定義實體然後建立資料庫並簡單的訪問,資料庫連結寫在app.config中:
<configuration><br /> <connectionStrings><br /> <add<br /> name="poco_db"<br /> providerName="System.Data.SqlClient"<br /> connectionString="Server=.;Database=poco_db;user id=sa;PassWord=sa;"/><br /> </connectionStrings><br /></configuration>
//枚舉類型<br /> public enum UserType<br /> {<br /> Admin,<br /> User,<br /> Guest,<br /> }<br /> //對枚舉類型的封裝,因為ComplexType只支援參考型別<br /> public class UserTypeWrapper<br /> {<br /> public int Value { get; set; }<br /> public static implicit operator UserTypeWrapper(UserType type)<br /> {<br /> return new UserTypeWrapper { Value = (int)type };<br /> }<br /> public static implicit operator UserType(UserTypeWrapper wrapper)<br /> {<br /> return (UserType)wrapper.Value;<br /> }<br /> public override string ToString()<br /> {<br /> return Value.ToString();<br /> }<br /> }<br /> //實體類Person<br /> public class Person<br /> {<br /> public string IdentityNo { get; set; }<br /> public string Name { get; set; }<br /> //關聯實體類Company<br /> public Company Company { get; set; }<br /> public UserTypeWrapper Type { get; set; }<br /> }<br /> //實體類Person的配置類<br /> public class PersonCfg : EntityTypeConfiguration<Person><br /> {<br /> public PersonCfg()<br /> {<br /> //定義主鍵<br /> HasKey(p => p.IdentityNo);<br /> //修改映射的表名稱<br /> Map<Person>(mc => mc.ToTable("t_person"));<br /> }<br /> }<br /> //實體類Company<br /> public class Company<br /> {<br /> public int CompanyId { get; set; }<br /> public string CompanyName { get; set; }<br /> }<br /> //實體類Compony的配置類<br /> public class CompanyCfg : EntityTypeConfiguration<Company><br /> {<br /> public CompanyCfg()<br /> {<br /> //定義主鍵<br /> HasKey(c => c.CompanyId);<br /> //取消自增<br /> Property(c => c.CompanyId).HasDatabaseGenerationOption(DatabaseGenerationOption.None);<br /> //修改映射的表名稱<br /> Map<Company>(mc => mc.ToTable("t_company"));<br /> }<br /> }<br /> //上下文<br /> public class POCOContext : DbContext<br /> {<br /> //設定資料庫的名稱<br /> public POCOContext() : base("poco_db") { }<br /> //用於訪問Person和Company<br /> public DbSet<Person> Persons { get; set; }<br /> public DbSet<Company> Companys { get; set; }<br /> //載入配置<br /> protected override void OnModelCreating(ModelBuilder modelBuilder)<br /> {<br /> //複雜類型類似於NHibernate中的嵌入類<br /> modelBuilder.ComplexType<UserTypeWrapper>();<br /> modelBuilder.Configurations.Add<Person>(new PersonCfg());<br /> modelBuilder.Configurations.Add<Company>(new CompanyCfg());<br /> base.OnModelCreating(modelBuilder);<br /> }<br /> }
class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> DbDatabase.SetInitializer<POCOContext>(new DropCreateDatabaseIfModelChanges<POCOContext>());<br /> using (var db = new POCOContext())<br /> {<br /> db.Database.CreateIfNotExists();</p><p> var c = db.Companys.Find(102);<br /> if (c == null)<br /> {<br /> c = new Company { CompanyId = 102, CompanyName = "邁思奇科技有限公司" };<br /> db.Companys.Add(c);<br /> }<br /> var p = db.Persons.Find("407");<br /> if (p == null)<br /> {<br /> p = new Person { IdentityNo = "407", Name = "Lucifer", Company = c, Type = UserType.User };<br /> db.Persons.Add(p);<br /> }<br /> else<br /> {<br /> p.Type = UserType.Guest;<br /> }<br /> var recordsAffected = db.SaveChanges();<br /> Console.WriteLine("Saved {0} entities to the database, press any key to exit.", recordsAffected);<br /> }<br /> }<br /> }