EF使用CodeFirst创建

Code First

Code First的微软的推荐用法是程序员只写模型类,数据库由EF 帮我们生成,当修改模型类之后,EF 使用“DB Migration”自动帮我们更改数据库。但是这种做法太激进,不适合很多大项目的开发流程和优化,只适合于项目的初始开发阶段。Java的Hibernate 中也有类似的DDL To SQL 技术,但是也是用的较少。“DB Migration”也不利于理解EF,因此在初学阶段,我们将会禁用“DB Migration”,采用更实际的“手动建数据库和模型类”的方式。

EF 的安装

基础阶段用Winform项目。使用NuGet 安装EntityFramework。会自动在App.config中增加两个entityFramework 相关配置段:

<configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework"
  type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
          requirePermission="false"/>
    </configSections>
    <entityFramework>
        <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
        </providers>
    </entityFramework>

在 web.config 中配置连接字符串:

 <connectionStrings>
    <add name="conn1" connectionString="Data Source=.;Initial Catalog=InlettDB;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
  </connectionStrings>

易错点:不能忘了写providerName="System.Data.SqlClient"增加两个entityFramework 相关配置段

EF 简单DataAnnotations 实体配置

假如数据库中有表Persons,有Id(主键,自动增长)、Pwd、Name、CreateTime字段。

  1. 创建Person类[Table(“Persons”)]因为类名(Person)和表名(Persons)不一样,所以要使用Table标注,如果数据库表名和类名一致则不需要Table
namespace CodeFirst.Model
{
    [Table("Persons")]
    public class Person
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Column("Password")]
        public string Pwd { get; set; }
        public DateTime CreateTime { get; set; }
    }
}

因为EF约定主键字段名是Id,所以不用再特殊指定Id是主键,如果非要指定就指定[Key]。因为字段名字和属性名字一致,所以不用再特殊指定属性和字段名的对应关系,如果需要特殊指定,则要用[Column(“Name”)]
*必填字段标注[Required]、字段长度[MaxLength(5)]、可空字段用int?、如果字段在数据库有默认值,则要在属性上标注[DatabaseGenerated]。
注意实体类都要写成public,否则后面可能会有麻烦。
2. 创建数据库上下文类(InLettDbContext)
首先这个类必须继承自System.Data.Entity的DbContext对象
数据库上下文类的作用就是操作数据库的工具,因此必须要和数据库进行连接
所以要使用DbContext的带参构造,参数可以给提前设置的连接字符串

 public class InLettDbContext:DbContext
    {
        //1.表示使用连接字符串中名字为con的去连接数据库
        public InLettDbContext():base("name=con")
        {

        }
        //2.通过对Persons 集合的操作就可以完成对Persons的操作,如果还有多张表对应的对象模型,有多少写多少
        public DbSet<Person> Person { get; set; }
    }

3.测试

 private void button1_Click(object sender, EventArgs e)
        {
            using (InLettDbContext context = new InLettDbContext())
            {
                Model.Person person = new Model.Person()
                {
                    Name = "张三",
                    Pwd = "123",
                    CreateTime = DateTime.Now
                };
                context.Person.Add(person);
                context.SaveChanges();
            }
        }

注意:InLettDbContext对象是否需要using有争议,不using也没事。每次用的时候new InLettDbContext就行,不用共享同一个实例,共享反而会有问题。SaveChanges()才会把修改更新到数据库中。
EF的开发团队都说要using DbContext,很多人不using,只是想利用LazyLoad 而已,但是那样做是违反分层原则的。我的习惯还是using。
异常的处理:如果数据有错误可能在SaveChanges()的时候出现异常,一般仔细查看异常信息或者一直深入一层层的钻InnerException 就能发现错误信息。
举例:创建一个Person对象,不给Name、CreateDateTime赋值就保存。

猜你喜欢

转载自blog.csdn.net/dust__/article/details/106268698