5.EF.Model测试导航属性关联操作(同时往两张表插入记录)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using EF.Model;using EF.BLL;namespace EF.Demo{ class Program {
static void Main(string[] args) {
BlogCategoryService service=new BlogCategoryService();
//创建博文分类
static void Main(string[] args) {
BlogCategoryService service=new BlogCategoryService();
//创建博文分类
BlogCategory cate = service.CreateBlogCategory();
cate.CateName = "EF分类标签";
//创建一篇博文
BlogArticle arti = service.CreateBlogArticle(); arti.Title = "EF进化论"; arti.Content = "EF测试内容"; //博文加到博文分类
cate.BlogArticle.Add(arti);
//更新 service.Insert(cate);
Console.ReadLine(); } }}
cate.CateName = "EF分类标签";
//创建一篇博文
BlogArticle arti = service.CreateBlogArticle(); arti.Title = "EF进化论"; arti.Content = "EF测试内容"; //博文加到博文分类
cate.BlogArticle.Add(arti);
//更新 service.Insert(cate);
Console.ReadLine(); } }}
6.结果
通过Model First的方式+ADO.NET DbContext Generator生成器 实现Code First方式业务(EDMX通过DbContext构造注入其中),到达Hibernate的效果。EDMX相当于Hibernate 对象模型XML映射文件,POCO相当于Hibernate对象模型(virtual实现关联导航加载),DbContext通过泛型构建IRepository数据操作类。之前看到相关测试,微软的EF ADO.NET 测试效率高出Hibernate 30%左右,不知道是不是真的-_-|||。
另外提一点 DbContext 可以转换为ObjectContext,用Refletor反编译看到是通过一个中间InternalContext实现的
实现代码: ObjectContext context = ((IObjectContextAdapter) DbContext).ObjectContext;
如果不想直接加载导航属性数据,你可以在DbContext的构造函数禁用延迟加载。
//------------------------------------------------------------------------------// <auto-generated>//
此代码是根据模板生成的。////
手动更改此文件可能会导致应用程序中发生异常行为。//
如果重新生成代码,则将覆盖对此文件的手动更改。//
此代码是根据模板生成的。////
手动更改此文件可能会导致应用程序中发生异常行为。//
如果重新生成代码,则将覆盖对此文件的手动更改。//
</auto-generated>//------------------------------------------------------------------------------
namespace EF.DAL{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using EF.Model;
public partial class DemoDBEntities : DbContext
{
public DemoDBEntities() : base("name=DemoDBEntities") {
//禁用延迟加载 this.Configuration.LazyLoadingEnabled = false;
//禁用代理 this.Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<BlogArticle> BlogArticle { get; set; }
public DbSet<BlogCategoryRepository> BlogCategory { get; set; }
public DbSet<BlogComment> BlogComment { get; set; }
public DbSet<BlogDigg> BlogDigg { get; set; }
public DbSet<BlogMaster> BlogMaster { get; set; }
public DbSet<BlogTag> BlogTag { get; set; }
}
}
namespace EF.DAL{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using EF.Model;
public partial class DemoDBEntities : DbContext
{
public DemoDBEntities() : base("name=DemoDBEntities") {
//禁用延迟加载 this.Configuration.LazyLoadingEnabled = false;
//禁用代理 this.Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<BlogArticle> BlogArticle { get; set; }
public DbSet<BlogCategoryRepository> BlogCategory { get; set; }
public DbSet<BlogComment> BlogComment { get; set; }
public DbSet<BlogDigg> BlogDigg { get; set; }
public DbSet<BlogMaster> BlogMaster { get; set; }
public DbSet<BlogTag> BlogTag { get; set; }
}
}
EF提供了强大的查询框架,有时间再写篇探讨自定义查询的,至此,不必犹豫不决了,可以在项目中实践一下。
如果表设计DateTime字段不允许为空,EF执行SaveChanges会出错,建议使用DateTime2类型解决(SQL2008以后版本)