天天看點

Entity Framework 4 第一篇 POCO

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,如需轉載請自行聯系原作者