简介
对于JAVA程序员来讲,一般对Hibernate都是很熟悉的。EF和Hibernate所起的角色一致。而EF多是约定优于配置。同样EF也有DataBase First和Code First的开发方式,本文介绍Code First的编程方式。
本文在连接的数据库是外置的SQLSERER
环境搭建
项目(Project)->Manager NuGet Packages…
Online -> EntityFrameWork -> Install
效果图
使用步骤
Model类的写法
- 数据库中对应的表,要对应一个Model类,表之间的关系通过类之间字段的关系来表示。如上一篇文章分析的那样,分别定义了类
User类
namespace GradeMIS.Models
{
public class User
{
public int UserId { get; set; }
public String UserName { get; set; }
public int Score { get; set; }
public int State { get; set; }
public String UsePasswd { get; set; }
public String Depart { get; set; }
public String Domain { get; set; }
public String RealName { get; set; }
public String Protitle { get; set; }
public String FinalGrade { get; set; }
public virtual List<CopyRight> CopyRights { get; set; }
public virtual List<Paper> Papers { get; set; }
public virtual List<Patent> Patents { get; set; }
public virtual List<Project> Projects { get; set; }
public virtual List<TeachingPrize> TeachingPrizes { get; set; }
public virtual List<TextBook> TextBooks { get; set; } }
}
UserId对应的是数据库中User表的主键UserId,如果要使用UserName做主键,必须在UserName属性上面加上[KEY]
User类中定义的Papers列表前面的virtual是懒加载,只有用到的时候才会查询数据库。
Paper类
namespace GradeMIS.Models
{
public class Paper
{
public int PaperId { get; set; }
public String PaperName { get; set; }
public String PaperType { get; set; }
public DateTime PubTime{ get; set; }
public String Desc { get; set; }
public int UserId{ get; set; }
public String Number { get; set; }
public virtual User User{get; set; }
}
}
Paper 类中的UserId要参照User的Id,所以在Paper类中必须定义UserId的属性。
其他类的Model和以上2个类似。
- 在Web.config文件夹中配置数据库访问
<connectionStrings>
<add name="GradeMISEntities" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=gradeMIS;User ID=sa;password=***;integrated security=true;" />
</connectionStrings>
name很重要,会建立一个同名类。providerName必须有,提供者名称。connectionString:连接字符串,大家应该都很熟悉。
- 接下来要建立一个同名的类GradeMISEntities,完成Model类和数据库中表的映射。
namespace GradeMIS.Models
{
public class GradeMISEntities:DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Admin> Admins { get; set; }
public DbSet<CopyRight> CopyRights { get; set; }
public DbSet<Paper> Papers { get; set; }
public DbSet<Patent> Patents { get; set; }
public DbSet<Project> Projects{ get; set; }
public DbSet<TeachingPrize> TeachingPrizes { get; set; }
public DbSet<TextBook> TextBooks { get; set; }
public DbSet<News> Newss { get; set; }
public DbSet<Banner> Banners { get; set; }
}
}
<>中的内容是Model类名,后面跟着的是数据库中的表的名称。
- 设置初试化数据要有一个SampleData 插入数据
下面是数据文件:
namespace GradeMIS.Models
{
public class SampleData : DropCreateDatabaseIfModelChanges<GradeMISEntities>
{
protected override void Seed(GradeMISEntities context)
{
var users = new List<User>
{
new User { UserName = "ymlabner", Score=0,State=1 , UsePasswd="123123",Depart="计算机学院",Domain="Java3D",RealName="yml", Protitle="院士",FinalGrade="博士"},
};
}
}
}
但要随着程序运行就插入数据,还要在Global.aspx文件中修改
protected void Application_Start()
{
///加上这句代码
System.Data.Entity.Database.SetInitializer(new SampleData());
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
- 当然要想随着程序启动就完成数据库创建,必须进行实例化,在HomeController中实例化
GradeMISEntities db = new GradeMISEntities();
- 运行程序后数据库变建立好了,程序和数据库和之间的映射建立好了,连初试数据也初始化了。
接下来在Controller的Action中就可以调用这个实例进行数据库的访问了,当然你可以将这些操作封装在数据访问层中。
采用EF增删改查的简单介绍(以User类为例)
GradeMISEntities db = new GradeMISEntities();
Create:
db.Users.Add(user);//user是传入的User对象
db.saveChages();
Delete:
db.Remove(user); //user是传入的User对象
db.saveChanges();
Query:
db.Users.ToList();//查询所有
db.Users.Single(g=>g.UserId==id)//id是传入的参数,查询结果为空会报错
db.User.SingleOrDefault(g=>g.UserId==id)//1条数据或空
db.User.Where(g=>g.UserId==id)//多条数据
、、、
Edit:
db.Entry(user).State = EntityState.Modified;//user为参数
db.SaveChanges();
小结
1 小结
本文介绍了Entity FrameWork的环境搭建以及在MVC项目中的使用,以及EF增删改查额简单语法。
2 参考资料
EF CODE FIRST 快速入门