zoukankan      html  css  js  c++  java
  • 学习EF之CodeFirst一

    最近将花点时间学习EF相关知识,通过文章来进行一个完整的学习,Code First是由先有代码后生成数据库;将通过一实例来进行学习;我们简单分为三层,其中DataLibrary为EF上下文处理层,ModelLib为实体层,而MainApplication为主程序层

    注意:DataLibrary层、MainApplication层要引用System.Data.Entity和EntityFramework.dll两个,还有一个就是ModelLib层,主程序还要引用DataLibrary层

    1:实体层ModelLib两个实体:Home实体,其中一个Home里面有多Person;

    using System.Linq;
    using System.Text;
    
    namespace ModelLib
    {
        public class Home
        {
            public int ID { get; set; }
    
            public string Address { get; set; }
    
            public List<Person> PersonList { get; set; }
        }
    }


    Person实体:

    using System.Linq;
    using System.Text;
    
    namespace ModelLib
    {
        public class Person
        {
            public int ID { get; set; }
    
            public string Name { set; get; }
    
            public string PassWord { get; set; }
    
            public int Age { get; set; }
        }
    }

    2:接下EF上下文层,我们通过继承自DbContext,它是在EntityFramework.dll里面的,所以要对它引用才会出现的;基中base("name=MyTestDb")就是配置文件里连接数据库的名称,其实也可以不写的,因为默认就是找配置文件里name和本类名称一致的数据库连接串,它生成的数据库名称就为是:MyDbContextFile;当然也可以像下面我们这种特别指定的name;

    using System.Data.Entity;
    using ModelLib;
    namespace DataLibrary
    {
        public class MyDbContext : DbContext
        {
            public MyDbContext()
                : base("name=MyTestDb")
            {
            }
    
            public DbSet<Person> Person { get; set; }
    
            public DbSet<Home> Home { get; set; }
        }
    }

    3:主程序包括配置跟代码两部分;app.config配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="MyTestDb" providerName="System.Data.SqlClient" connectionString="Server=.;Database=TestDb;user=sa;pwd=admin"/>
      </connectionStrings>
    </configuration>

    代码如下:

    using ModelLib;
    using DataLibrary;
    using System.Data.Entity;
    namespace MainApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());
                InsertDbInfo();
                Console.WriteLine("插入成功");
            }
    
            private static void InsertDbInfo()
            {
                List<Person> list=new List<Person>(){
                    new Person(){ ID=1, Name="Wujy", Age=27, PassWord="123456"},
                    new Person(){ID=2, Name="Zyb", Age=24, PassWord="654321"},
                    new Person(){ID=3, Name="Xim", Age=24, PassWord="987654"}
                };
    
                var HomeModel = new Home()
                {
                    ID = 1,
                    Address = "厦门市思明区",
                    PersonList = list
                };
    
                using (var context = new MyDbContext())
                {
                    context.Home.Add(HomeModel);
                    context.SaveChanges();
                }
            }
        }
    }

    其中代码:Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDbContext>());是因为后期我们肯定不停的要修改Model里的实体,所以加这句代码如果实体类有变化,那么重新生成一下数据库,使用这个方法在System.Data.Entity命名空间里

    4:查看数据库生成的效果:

    注意:表EdmMetadata

    EF并不需要EdmMetadata表在你的数据库中。这些表只是为了检测模型类的变化。如果你明白在干什么,你可以随意的删除EF中的EdmMetadata表。一旦你删除EdmMetadata表,你(或者你的数据库管理员)将负责手工同步数据库结构和模型类结构。你可以手工调节保持模型和数据库之间的映射同步。

    Entity Framework Code First中映射习惯。

    1. 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。当然后边会介绍怎么进行配置。

    2.表映射:Code First 默认会按照类型名复数建立数据表,比如说ProductCatalog类对应的表名就叫ProductCatalogs.后边会介绍如何改变默认的表名。

    3.列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为nvarchar(max),decimal会映射为decimal(18,2)。后边会介绍如何更改column的名称,类型以及其他特性。

    4.主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。这些也是可以改的。

  • 相关阅读:
    ICPC-Beijing 2006 狼抓兔子
    【模板】多项式求逆
    AHOI2014/JSOI2014 奇怪的计算器
    Hnoi2013 切糕
    Ahoi2014&Jsoi2014 支线剧情
    bzoj3774 最优选择
    WC2019游记
    HNOI2007 分裂游戏
    bzoj1457 棋盘游戏
    poj2484 A Funny Game
  • 原文地址:https://www.cnblogs.com/wujy/p/3331042.html
Copyright © 2011-2022 走看看