zoukankan      html  css  js  c++  java
  • EF Code First建库 增删改查

    接触过EF的应该都知道EF的编程模型目前有3种。

    • DataBase First:数据库先行
    • Model First:模型先行
    • Code First:代码先行

    Code First可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库。

    首先来编写个简单的学生(Student)类。通常叫着实体类,最后会生成数据库中的表

        class Students
        {
            [Key]
            public int stuId { get; set; }
            public string stuName { get; set; }
            public string stuAdress { get; set; }
            public int stuAge { get; set; }
        }

    连接上下文DbContext

       class StuDbContext : DbContext
        {
            public DbSet<Students> student { get; set; }
        }

    然后添加一个方法,用于向数据库添加数据

         static void Add()
            {
                Students st = new Students { stuAdress = "中关村", stuAge = 20, stuName = "刘德华" };
                using (StuDbContext db = new StuDbContext())
                {
                    db.student.Add(st);
                    db.SaveChanges();
                }
            }

    然后就是Main方法

        static void Main(string[] args)
            {
                Add();
                Console.WriteLine("成功");
                Console.ReadKey();
            }

    程序运行成功后,数据库已经创建了,这里我要说的是,如果你跟我一样是vs2012,本地数据库没有.\sqlexpress,也就是说连接数据库的服务器名称是

    local或者就是一个点 .

    当你连接数据库的后,明明代码运行成功却没生成数据库而纠结的时候,当时我也是同样的问题。原因很简单。

    因为我们没有显示指定连接数据库字符串,Code First会默认生成到 .\sqlexpress,但你本地并没有 .\sqlexpress 这个时候EF就会在 localdb 下生成数据库,其实

    当你安装vs2012的时候就已经给你默认安装了 localdb数据库,就像我们安装vs2010的时候默认安装了express版本的数据库,你可以找到路径:C:\Program Files\Microsoft

    SQL Server\110\LocalDB 这就是localdb。那代码运行成功。我们连接数据库,服务器名称用:(localdb)\v11.0  身份验证用:windows身份验证  连接即可

    成功后看数据库,并查询刚插入的数据


    也许你会疑问 ,那刚生成的数据保存在哪里了,保存在你桌面的用户文件下,

     

     

     

     

     

     

     

     

    在实际项目中是不会这样搞的。一般都会配置数据库连接字符串。那该怎么配置呢,vs2012建项目时,默认生成了一个App.config配置文件,如果没有的话你可以手动添加

    应用程序配置文件。

      <connectionStrings>
        <add name="stuDb" connectionString="server=.;database=StudentInfo;Trusted_Connection=true" providerName="System.Data.sqlClient"/>
      </connectionStrings>

    ps:连接字符串中的Trusted_Connection:Trusted_Connection=false/no时,在连接中要必须指定密码和用户名,当没指明Trusted_Connection的值时,
    默认是false/no。当Trusted_Connection=true/yes时。说明server database已设置为用信任连接了,
    连接中可以不用指明用户名和密码(当然:你指定用户名和密码也不会去验证。是多此一举)。此时将使用当前的 Windows 帐户凭据进行身份验证。

    上面写的后。数据库生成的位置是sql安装的位置。如果这样写:

     <add name="sutDb" connectionString="Data Source=.;database=Demo;uid=sa;pwd=123;AttachDBFilename=|DataDirectory|\Demo.mdf;" 
    providerName="System.Data.SqlClient"/>

    解释:

    |DataDirectory| 是指 App_Data目录
    Data Source=|DataDirectory|\Demo.mdf
    其中|DataDirectory|默认是映射为App_Data的目录。
    如 果名为 DataDirectory 的物理目录必须作为元数据路径列表的成员传递,则应在该名称的一边或两边添加空格,

    例:Metadata="DataDirectory1 | DataDirectory | DataDirectory2"。ASP.NET 应用程序将 |DataDirectory| 解析为“<应用程序根目录>/app_data”文件夹。

     

     AttachDBFilename=|DataDirectory|\Demo.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下。

    然后修改上下文类  StuDbContext

    class StuDbContext : DbContext
    {
        //配置文件中为stuDb的连接字符串,如果没找到,就会以stuDb做为数据库名,创建数据库。
    但如果写成name=stuDb格式。当没找到会报异常,No connection string named 'stuDb' could be found in the application config file.
    public StuDbContext() : base("stuDb")  
    { }

    public DbSet<Students> student { get; set; }

    }

    然后运行程序,看看效果

    接下来看更新 删除 查找 数据

     用过的朋友就知道。code first的查询和添加数据跟DB first,Moedel first一样,不同的是删除和更新。不过都差别不大,先看查询方法

     static void Select()
            {
                StudentContext db = new StudentContext();
                var student = from su in db.student
                              select su;
                foreach (var item in student)
                {
                    string result = string.Format("{0}\t{1}\t{2}\t{3}", item.stuId, item.stuAge, item.stuAdress, item.stuName);
                    Console.WriteLine(result);
                }
    
                //同样可以查询
                var st = from su in db.student
                         select new
                         {
                             name = su.stuName,
                             age = su.stuAge,
                             id = su.stuId,
                             adress = su.stuAdress
                         };
    
                st.ToList().ForEach(item => Console.WriteLine(item));
                Console.ReadKey();
            }

    看运行后的结果图

    更新数据我们同时用ObjectContext和DbContext来尝试,因为DbContext可以转换为ObjectContext,我们修改记录如下:刘德华改成释小龙,地址改为香港,年龄还是20。

            /// <summary>
           /// 修改数据
            /// </summary>
            static void Update()
            {
                //修改数据是根据主键来找数据的。这也说明建表必须要有key
                Student st = new Student();
                st.stuId = 1;  //根据id找到记录
                  st.stuName = "释小龙";
                st.stuAdress = "香港";
                st.stuAge = 20;
                StudentContext db = new StudentContext();
    
                //修改方式一:把DbContext转换成ObjectContext进行数据库更新
                  ObjectContext context = ((IObjectContextAdapter)db).ObjectContext;  //IObjectContextAdapter所需命名空间:using System.Data.Entity.Infrastructure
                db.student.Attach(st);
                context.ObjectStateManager.ChangeObjectState(st, EntityState.Modified);  //
                db.SaveChanges();
    
    
                //修改方式二:直接用DbContext更新
                 db.student.Attach(st);  //待更新的数据附加到db。也就是上下文
                 db.Entry(st).State = EntityState.Modified; //EntityState 得引用 System.Data.Entity    告诉上下文。状态是修改。 同理把EntityState.Deleted就是删除。
                 //db.Entry<Student>(st).State = EntityState.Modified;
               db.SaveChanges();  //保存
            }

    OK 继续,看数据库并且查询看结果

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=301880
      -->
    <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>
      <appSettings>
        <add key="webpages:Version" value="3.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <connectionStrings>
        <add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=数据库;User ID=SA;Password=123456" providerName="System.Data.SqlClient" />
      </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5.1" />
        <httpRuntime targetFramework="4.5.1" />
      </system.web>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    View Code

    好了,这里记录的是我在这几天揣摩过程中一些不惑的知识。同时也是很简单入门的知识点,园子里关于code first的详细介绍已经有很好的文章了,不过学习有好的资料还不够。还要你有好学习态度和专研精神。这里推荐两个链接,好好学咯!

    http://www.cnblogs.com/zhisong

    http://www.cnblogs.com/Gyoung/

    作者: nsky
    出处: http://nsky.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,共同学习;共同进步;但不能乱搞!
  • 相关阅读:
    $.ajax()、$.post()、$.get()
    Json数据格式
    iOS UIButton 调节文字和图片的位置
    block 中使用 weakSelf
    iOS 移除导航栏黑线
    Swift 设置导航栏透明
    Xcode 8 证书管理 Signing for "xxxx" requires a development team.
    iOS 中文登录 中文参数 转码
    ios apple pay 证书配置
    Missing iOS Distribution signing identity for ... Xcode can request one for you.
  • 原文地址:https://www.cnblogs.com/nsky/p/2892459.html
Copyright © 2011-2022 走看看