此文章为读Code-First develoment with entity framework简单笔记。
1.首先我们创建一个Person类
public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
接着创建Context类,该类继承于DbContext类
public class Context:DbContext { public Context() : base("ConnectionString") { } public DbSet<Person> People { get; set; } }
注意base(“ConnectionString”)需要配置链接字符串,否则EF会使用默认连接设置。
<connectionStrings> <add name="ConnectionString" connectionString="data source=192.168.0.14;initial catalog=EfSample;user id=sa;password=" providerName="System.Data.SqlClient"/> </connectionStrings>
使用下面代码,如果数据库不存在,那么会在数据创建数据
static void Main(string[] args) { using(var context=new Context()) { bool temp= context.Database.CreateIfNotExists(); if (temp) { Console.WriteLine("创建成功!"); } else { Console.WriteLine("创建失败!"); } } Console.ReadKey(); }
运行本段代码后你会发现在数据库中创建了名为”EfSample”的数据库,这个数据库名称就是刚刚在配置文件中设置连接字符串的数据库名。
2.增加一条记录到我们创建的数据库
class Program { static void Main(string[] args) { using(var context=new Context()) { bool temp= context.Database.CreateIfNotExists(); var person = new Person { FirstName = "John", LastName = "Doe" }; context.People.Add(person); context.SaveChanges(); } Console.ReadKey(); } }
使用这段代码会发现在数据库中创建了People表,并增加了一条记录,EF为自动判断数据库中是否有People表(表名根据Context类中定义的public DbSet<Person> People { get; set; }属性名称)。我们也可以映射自己已经创建好的表,在后面会讲到。在这段代码中你为发现我们并没有给PersonId赋值,EF会自动把+Id名称的自动设置为表主键。
3.查询数据库
using(var context=new Context()) { var peopleList = context.People; foreach(Person person in peopleList) { Console.WriteLine("Last name:{0},first name:{1},id {2}",person.LastName, person.FirstName, person.PersonId); } }
这样会查找所有People表中的数据,EF会自动生成“select * from People“语句去执行。使用LINQ和Lambda表达式可以执行更多复杂的查询,在后面会讲到。
4.更新数据
using(var context=new Context()) { var savedPeople = context.People; if (savedPeople.Any())//判断是否有数据 { var person = savedPeople.First(); person.FirstName = "Johnny"; person.LastName = "Benson"; context.SaveChanges(); } }
5.删除一条数据
using(var context=new Context()) { var persionId = 2; var person = context.People.Find(persionId); if (person != null) { context.People.Remove(person); context.SaveChanges(); } }
首先我们根据主键(注意这个方法查找必须是主键object[] keyValues,就是所有主键列,否则出错。)查找出对象,然后利用Remove删除,最后保存。
6.数据Model改变了怎么办
当在代码中添加了
public class Company { public int CompanyId { get; set; } public string Name { get; set; } }
public class Context:DbContext { public Context() : base("ConnectionString")//为配置文件中连接字符串名称 { } public DbSet<Person> People { get; set; } public DbSet<Company> Companies { get; set; } }
那么我们就改变了Context的Schema,在运行代码会报出异常信息。后面会讲到数据迁移。这里我们使用初始化器来简单的解决。
• CreateDatabaseIfNotExists<TContext>
• DropCreateDatabaseIfModelChanges<TContext>
• DropCreateDatabaseAlways<TContext>
public class Initializer: DropCreateDatabaseIfModelChanges<Context> { }
static void Main(string[] args) { Database.SetInitializer(new Initializer()); // more code follows
public class Initializer: DropCreateDatabaseIfModelChanges<Context> { protected override void Seed(Context context) { context.Companies.Add(new Company { Name = "My company" }); } }
注意这样初始化如果Model改变了,就会删除数据库并重新创建,那么我们数据库里的数据就会被删除,后面会讲到解决方法。