Entity Framework Code First(概要)

EF开源项目地址:https://github.com/aspnet/EntityFramework6

MSDN :https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx

 中文:https://msdn.microsoft.com/zh-cn/library/bb399567(v=vs.110).aspx

开始EF

1、安装EF 

    新建类库项目,打开程序包控制台安装EF

PM>Install-Package EntityFramework

2、配置数据库连接    成功后会在类库项目下自动生成app.config和packages.config(该项目所有包清单),重点看项目配置app.config。给connectionStrings节点添加一个连接

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>
  <connectionStrings>
    <add name="Practice" connectionString="Data Source=(localdb)ProjectsV13;Initial Catalog=Practice.Sample;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
app.config

DbContext

 1 public class PracticeEntitys : DbContext
 2     {
 3         public PracticeEntitys()
 4             : base("Name=Practice")
 5         {
 6 
 7         }
 8 
 9         public new Database Database
10         {
11             get { return base.Database; }
12         }
13 
14 
15     }

 DataAnnotation

Table:[ Table("自定义table名")]

Column:[Column("列名",TypeName="varchar")]

Key:设置自定主键,如果不指定该属性,则默认寻找带ID的字段设为主键

DatabaseGenerated表示数据库自动生成,该属性传参数DatabaseGeneratedOption.枚举:Identity:自增长 None:不处理 Computed:表示这一列是计算列

Required:不可为空

NoMapped:不映射某字段加该属性

MaxLength(int)、MinLength(int):设置最大最小长度

ForeignKey("指定列名")和virtual的字段连用设置外键

Index:索引

ComplexType:复杂类型:如可以在下面的commonDate类上加该特性。当然这里推荐使用继承

并发控制:

Timespan和ConcurrentCheck,效果都是一样,原理都是比较当前更新的实体和原数据实体的 对应标识了并发的字段是否一致,不一致就抛出异常

[Table("article")]
    public class Article: CommonDate
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
        public string Title { get; set; }

        public Int64 Click { get; set; }

    }


    public class CommonDate
    {
        public DateTime CreateDate { get; set; }
        public DateTime ModifyDate { get; set; }
    }

迁移 Migration

1、开启迁移

PM>Enable-Migrations

可选参数:

-EnableAutomaticMigrations:开启自动迁移。开启后configuration.cs会设置自动迁移为true,那么这么做实现什么效果呢?不开启状态下我们需要add-migration 然后update迁移到数据库,并生成对应的Migration结构文件;如果开启自动迁移,那么可以省去add的步骤直接update更新到数据库,但是这样也不会生成Migration的结构文件。结果显而易见正常生产环境不建议开启,一般我这里会设置为false。

public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

-ContextTypeName 全限定名:如果一个项目多个Context,用该参数指定

-StartUpProjectName:使用项目,和手动在程序包控制台选择使用项目一样效果

-Force:强制

关于错误:找不到配置字符串

(1)、检查配置文件的名称是否和Dbcontext子类设置的名字一样

(2)、确认字符串的情况下如果还报错,先把类库设置为启动项目

2、添加迁移,自定义命名initdatabase,EF会自动根据上面继承DbContext的类的变化和约定的变化,生成Flut的cs文件到Migration文件夹里,并且会自动加上时间戳。如:时间_自定义名.cs

PM>add-migration initdatabase

3、更新到数据库;执行完上面的语句,数据库仍然是不会变化,接下来把表结构更新到数据库

PM>update-database -verbose

4、批量生成脚本

注意:批量生成的时候注意是按照上面 2里面自动添加的 时间顺序执行的。

PM>Update-Database -Script -SourceMigration:开始Migration.cs -TargetMigration: 结束Migration.cs

 可以只指定target参数进行回溯

5、迁移检查

public TestDbContext() : base("name=Default")
{
//不会创建数据库,生产环境建议用这个设置,表通过sql来创建或修改
Database.SetInitializer<TestDbContext>(null);
 
// 数据库不存在时重新创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new CreateDatabaseIfNotExists<TestDbContext>());
             
 
//每次启动应用程序时创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseAlways<TestDbContext>());
             
//模型更改时重新创建数据库,会删除主项目或其他插件的表
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseIfModelChanges<TestDbContext>());
}

 Fluent API

见上篇:http://www.cnblogs.com/xmai/p/3919494.html

原文地址:https://www.cnblogs.com/xmai/p/6744950.html