Entity Framework 4 第一篇 POCO
在EFv1版本中,并沒有提供對POCO(Plain Old CLR Objects)的支援。目前,在.Net4.0 Beta2中的EF 4完善了很多。可以預見,正式的EF4版本應該會有很多改進和完善。在EF4中的提供了對POCO的支援。并支援的資料定義語言(DDL)。這樣,我們可以不需要事先生成EDMX檔案,而是通過代碼程式設計來實作對資料的操作(Code Only)。
下面,介紹在EF4中利用POCO來實作資料定義操作。
第0步:準備工作:
作業系統:Windows 7旗艦版
開發環境:VS2010 Beta2+SQL Server2008
第1步:先建立需要的資料模型類。
例如:我們分别建立Person和Company兩個POCO資料模型,以便對應資料庫中的Person和Company表,代碼如下:
///<summary>
///對應資料庫中的Person表
///</summary>
public class Person
{
public string IdentityNo { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
public Company Company { get; set; }
public string Position { get; set; }
}
///對應資料庫中的Company表
public class Company
public int CompanyId { get; set; }
public string CompanyName { get; set; }
public string Province { get; set; }
public string City { get; set; }
public string Address { get; set; }
public string HomePage { get; set; }
第2步:建立上下文通路類
因為此時是沒有EMDX檔案的。是以,建立我們需要建立一個繼承自ObjectContext的上下文通路類,用描述及通路我們之前定義的資料模型。代碼如下:
public class POCOContext : ObjectContext
public POCOContext(EntityConnection conn) : base(conn) { }
public ObjectSet<Person> Persons
{
get
{
return base.CreateObjectSet<Person>();
}
}
public ObjectSet<Company> Companies
return base.CreateObjectSet<Company>();
第3步:代碼實作
接着,我們就隻需要通過建立一個POCOContext上下文,以便來完成我們的資料庫操作就可以了。代碼如下:
[TestMethod]
public void TestMethod1()
//
// TODO: Add test logic here
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;user id=sa;PassWord=11111111;Initial Catalog=NewNorthwind");
var builder = new ContextBuilder<POCOContext>();//建立上下文
builder.Entity<Person>().HasKey(p => p.IdentityNo);//設定表的主鍵為IdentityNo字段
builder.Entity<Company>().HasKey(c => c.CompanyId);//設定表的主鍵為CompanyId字段
POCOContext context = builder.Create(con);
if (!context.DatabaseExists())
context.CreateDatabase();//建立資料庫
}
最後,運作上面的測試,就會自動建立一個名為NewNorthwind的資料庫,并包含Person和Company兩張表。如下圖所示:
在EF4中,ObjectContext擴充更多的方法,如下:
public static class ObjectContextExtensions
public static void CreateDatabase(this ObjectContextcontext);
public static string CreateDatabaseScript(thisObjectContext context);
public static bool DatabaseExists(this ObjectContextcontext);
public static void DeleteDatabase(this ObjectContextcontext);
同時,EF4實體類也提供了更多的方法,如下:
public class EntityConfiguration<TEntity> :StructuralTypeConfiguration<TEntity>
public EntityConfiguration();
public EntityConfiguration<TEntity> HasKey<TKey>(Expression<Func<TEntity, TKey>> getKey);
public HierarchyEntityMapGenerator<TEntity> MapHierarchy();
public EntityMap MapHierarchy(Expression<Func<TEntity,object>> propertyMap);
public EntityMap MapSingleType(Expression<Func<TEntity,object>> propertyMap);
public NavigationPropertyConfiguration<TEntity, TRelated> Relationship<TRelated>(Expression<Func<TEntity,ICollection<TRelated>>> propertyExpression);
public NavigationPropertyConfiguration<TEntity, TRelated> Relationship<TRelated>(Expression<Func<TEntity, TRelated>> propertyExpression);
public RelationshipPropertyConfiguration<TEntity, TRelated> RelationshipFrom<TRelated>(Expression<Func<TRelated,ICollection<TEntity>>> propertyExpression);
public RelationshipPropertyConfiguration<TEntity, TRelated> RelationshipFrom<TRelated>(Expression<Func<TRelated, TEntity>> propertyExpression);
這樣,通過這些擴充的方法,我們可以隻通過代碼程式設計的方式(Code Only)對資料庫以及資料庫中各個表間的關系進行操作。
個人覺得,與.Net3.5 SP1中的EF v1版相比,的确是很大的改進,感覺越來越像NHibernate了。相信在未來正式釋出的.Net4.0中,EF4應該會更加完善了。
本文轉自風車車 部落格園部落格,原文連結:http://www.cnblogs.com/xray2005/archive/2010/01/06/EF4.html,如需轉載請自行聯系原作者