• [ORM] Entity Framework(1) CodeFirst快速入门


        Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案
        对象关系映射(英语:Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

        下载:Install-Package EntityFramework -Version 6.1.3  (7.0只有CodeOnly模式)

        本节技术概览:数据库的安装DB First,Model FirstCode First(重点)DbContext,DbSetCRUD例子数据迁移以及事务管理

    LocalDB和SQL Server安装

      LocalDb是visual studio自带的,用来开发使用。运行是采用进程形式而非服务形式。

      位置:C:Program FilesMicrosoft SQL Server110ToolsBinnSqlLocalDB.exe(这是vs 2013的位置,使用VS2013开发人员工具输入sqllocaldb即可)

      SQL Server采用服务方式,方便连接管理。可以去itellyou.cn下载。

    连接

      可以直接用vs连接这2种数据库。连接localdb

    DB First,Model First

      

    DB First采用通常的数据库先行的办法,常见,稳定。基本下一步下一步就能完成。

    Model First在VS中 画模型图,来生成数据库和Object,不方便控制数据库。

    这2个都会产生edmx文件(xml),包含SSDL(数据定义),CSDL(类定义),CS Mapping(数据类映射)

    在edmx模型查看中,不会把所有表都显示。当2个表的关系为多对多的时候,关系表会由一条多对多的线来表示。

    在Model Browser中,可以看到存储过程,视图等非表的信息。

    CodeFirst

      在EF7中,只有Code Only 说明Code First的重要性。在使用中,中小型项目,我也推荐使用,毕竟开发效率提高了不止一点点。

    创建POCO

        public class App
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public virtual ICollection<AppData> AppDatas { get; set; }
        }
    
        public class AppData
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
            public virtual App App { get; set; }
        }

     创建DbContext

        public class AppContext : DbContext
        {
            public AppContext()
                : base("AppDb")           //AppDb数据库库名
            {
                
            }
            public DbSet<App> Apps { get; set; }
            public DbSet<AppData> AppDatas { get; set; }
        }
    

    文件结构:

    app.config

    <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>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
      <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

    Main方法

            static void Main(string[] args)
            {
                using (var ctx = new AppContext())
                {
                    var app = new App() { Name = "博客园" };
                    var data = new[]
                    {
                        new AppData() {Name = "最新博客", Value = "XX", App = app},
                        new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}
                    };
                    ctx.Apps.Add(app);
                    ctx.AppDatas.AddRange(data);
                    ctx.SaveChanges();
                }
            }
    

    连接数据库,查看数据库。

            

    DbContext,DbSet

      在EF中,DbContext相当于一个数据库,DbSet则相当于一个数据表或者视图。

     

    数据迁移

    当业务改变,POCO类需要改变,表也需要改变。

    EF的数据迁移通过 NuGet 来进行。

    打开程序包管理器控制台(Package Manager Console),键入“get-help EntityFramework”命令,可以获得相关的帮助信息。

    Enable-Migrations [-Force]

    Add-Migration

    Update-Database

    Get-Migrations

    如:加一个Title属性

        public class App
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Title { get; set; }  //add prop  
            public virtual ICollection<AppData> AppDatas { get; set; }
        }

    启动迁移功能

    文件结构

    生成改变

    如果觉得太麻烦,可以使用以下方式

        public class AppContext : DbContext
        {
            public AppContext()
                : base("AppDb")           //AppDb数据库库名,也可以换成连接字符串
            {
                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AppContext>());
            }
            public DbSet<App> Apps { get; set; }
            public DbSet<AppData> AppDatas { get; set; }
        }

     CRUD例子:

                using (var ctx = new AppContext())
                {
                    //crud
                    #region create
                    var app = new App() { Name = "博客园" };
                    var data = new[]
                    {
                        new AppData() {Name = "最新博客", Value = "XX", App = app},
                        new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}
                    };
                    ctx.Apps.Add(app);
                    ctx.AppDatas.AddRange(data);
                    ctx.SaveChanges();
                    #endregion
    
                    #region update
                    app.Name = "Never、C";
                    ctx.SaveChanges();
                    //or
                    ctx.Apps.AddOrUpdate(app);
                    #endregion
    
                    #region read
                    app = ctx.Apps.FirstOrDefault(o => o.Name == "博客园");
                    Console.WriteLine(app);
                    #endregion
    
                    #region delete
                    ctx.Apps.Remove(app);
                    #endregion
                }
    EF CRUD




    事务管理

    对于一个ORM框架,支持事务操作是必须的。

    我们的每一次SaveChanges就是一个事务操作,只需要在所有更改都完成后,调用这个方法就可以了。

    如果你不愿意,可以手动的开启事务的代码 :

    DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
    con.Open();
    using (var tran = con.BeginTransaction())
    {
      // 这里才是事务中的代码

       tran.Commit();
    }
    con.Close();

    以上是针对一个DbContext,也就是一个数据库的时候,如果操作涉及到多个数据库,还是使用分布式事务操作比较靠谱。

    使用分布式事务处理,需要Windows系统的支持,所以,我们需要将系统的MSDTC服务开启。

    代码下载:EFTest.zip

  • 相关阅读:
    JVM调优总结(转载)
    项目应该如何分层(转载)
    SpringCloud Feign 配置(基于Consul)
    yml配置文件嵌套
    SpringCloud Zuul基于Consul配置及详解
    springBoot聚合项目打包
    SpringCloud Config 配置(基于Consul)
    hibernate的三种状态
    IOS 图片全屏预览
    IOS 下拉菜单
  • 原文地址:https://www.cnblogs.com/neverc/p/4587692.html
Copyright © 2020-2023  润新知