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; }
}
///<summary>
///对应数据库中的Company表
///</summary>
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; }
public string Phone { 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
{
get
{
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 ObjectContext context);
public static string CreateDatabaseScript(this ObjectContext context);
public static bool DatabaseExists(this ObjectContext context);
public static void DeleteDatabase(this ObjectContext context);
}
同时,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应该会更加完善了。