zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    for语句及switch case用法示例
    ●验证控件
    ●LinQ to SQL
    ●操作Word
    141107●VS2012的一些使用技巧
    ●Winform拖动无边框窗口、播放音频、启动外部exe程序
    ●操作文件目录及文件
    ●流
    ●事务及异常处理
    ●Winform对话框
  • 原文地址:https://www.cnblogs.com/xmai/p/6744950.html
Copyright © 2011-2022 走看看