天天看點

對Entity Framework 4.0嘗試的吐槽

因為新公司的同僚以前用過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>

<connectionStrings>

<add

name="poco_db"

providerName="System.Data.SqlClient"

connectionString="Server=.;Database=poco_db;user id=sa;PassWord=sa;"/>

</connectionStrings>

</configuration> 

//枚舉類型

public enum UserType

{

Admin,

User,

Guest,

}

//對枚舉類型的包裝,因為ComplexType隻支援引用類型

public class UserTypeWrapper

{

public int Value { get; set; }

public static implicit operator UserTypeWrapper(UserType type)

{

return new UserTypeWrapper { Value = (int)type };

}

public static implicit operator UserType(UserTypeWrapper wrapper)

{

return (UserType)wrapper.Value;

}

public override string ToString()

{

return Value.ToString();

}

}

//實體類Person

public class Person

{

public string IdentityNo { get; set; }

public string Name { get; set; }

//關聯實體類Company

public Company Company { get; set; }

public UserTypeWrapper Type { get; set; }

}

//實體類Person的配置類

public class PersonCfg : EntityTypeConfiguration<Person>

{

public PersonCfg()

{

//定義主鍵

HasKey(p => p.IdentityNo);

//修改映射的表名稱

Map<Person>(mc => mc.ToTable("t_person"));

}

}

//實體類Company

public class Company

{

public int CompanyId { get; set; }

public string CompanyName { get; set; }

}

//實體類Compony的配置類

public class CompanyCfg : EntityTypeConfiguration<Company>

{

public CompanyCfg()

{

//定義主鍵

HasKey(c => c.CompanyId);

//取消自增

Property(c => c.CompanyId).HasDatabaseGenerationOption(DatabaseGenerationOption.None);

//修改映射的表名稱

Map<Company>(mc => mc.ToTable("t_company"));

}

}

//上下文

public class POCOContext : DbContext

{

//設定資料庫的名稱

public POCOContext() : base("poco_db") { }

//用于通路Person和Company

public DbSet<Person> Persons { get; set; }

public DbSet<Company> Companys { get; set; }

//加載配置

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

//複雜類型類似于NHibernate中的嵌入類

modelBuilder.ComplexType<UserTypeWrapper>();

modelBuilder.Configurations.Add<Person>(new PersonCfg());

modelBuilder.Configurations.Add<Company>(new CompanyCfg());

base.OnModelCreating(modelBuilder);

}

class Program

{

static void Main(string[] args)

{

DbDatabase.SetInitializer<POCOContext>(new DropCreateDatabaseIfModelChanges<POCOContext>());

using (var db = new POCOContext())

{

db.Database.CreateIfNotExists();

var c = db.Companys.Find(102);

if (c == null)

{

c = new Company { CompanyId = 102, CompanyName = "邁思奇科技有限公司" };

db.Companys.Add(c);

}

var p = db.Persons.Find("407");

if (p == null)

{

p = new Person { IdentityNo = "407", Name = "Lucifer", Company = c, Type = UserType.User };

db.Persons.Add(p);

}

else

{

p.Type = UserType.Guest;

}

var recordsAffected = db.SaveChanges();

Console.WriteLine("Saved {0} entities to the database, press any key to exit.", recordsAffected);

}

}

下一篇: CopyMemory