zoukankan      html  css  js  c++  java
  • EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性

    ---------------------目录--------------------------

    EntityFramework 5.0 CodeFirst 教程03-数据结构的定义/列的属性 (2015-07-22 17:30)

    EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理 (2015-07-14 17:50)

    EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 (2015-07-13 10:48)

    ---------------------目录--------------------------

    首先感谢大家的支持,最近比较忙,不过会抽时间讲完Code First的 谢谢大家的支持 想更多的学习资源,可以访问我的主页的,谢谢

    这集我们来学习定义一个数据结构,首先看一下.NET类型和SQL类型的对应表,左侧是sql类型,右侧是.NET类型

    1 配置简单属性
    这里,我们继续使用Person这个类来配置属性,修改后代码如下:
     public class Person
        {
            public int PersonId { get; set; }
            [MaxLength(30)]
            public string FirstName { get; set; }
            [MaxLength(30)]
            public string LastName { get; set; }
            [StringLength(1, MinimumLength = 1)]
            [Column(TypeName = "char")]
            public string MiddleName { get; set; }
        }
    给每个属性添加了一些属性标注,
    其中MaxLength(30)表示字段的最大长度为30,
    StringLength表示最小长度和最大长度MinimumLength

    [Column(TypeName = "char")] 表示该列属性是一个char类型

    需要引用System.ComponentModel.DataAnnotations这个程序集
    下面我们写下面的代码,然后执行
    static void Main(string[] args)
            {
                //更多资料可以登录本人的主页:www.bamn.cn 欢迎大家
                using (var personContext = new Context())
                {
                    //如果不存在数据库则创建
                    bool res = personContext.Database.CreateIfNotExists();
                    //往数据库中添加数据
                    var person = new Person
                    {
                        FirstName = "John",
                        LastName = "Doe",
                        MiddleName = "Mid"
                    };
                    personContext.People.Add(person);
                    personContext.SaveChanges();
                    //获取数据
                    var savedPeople = personContext.People;
                    foreach (var p in savedPeople)
                    {
                        Console.WriteLine("Last name:{0},first name:{1},id {2},mid={3}",
                        p.LastName, p.FirstName, p.PersonId,p.MiddleName);
                    }
                } 
               
                Console.ReadKey();
            }
     
    需要当我们晕写代码的时候,报下面的异常
    “System.InvalidOperationException”类型的未经处理的异常在 EntityFramework.dll 中发生 
    其他信息: The model backing the 'Context' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
     
    我们后面再来解决这个问题,下面先临时解决,首先我们先删除我们的数据库 就算以前连接的那个数据库EFDemo
    删除后,我们再次运行
    发现还是报下面的异常
    “System.Data.Entity.Validation.DbEntityValidationException”类型的未经处理的异常在 EntityFramework.dll 中发生 
    其他信息: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
     
    但是我们访问数据库的时候,发现我们的表已经创建了
    这里要给大家说一下,就是,我们使用CODE FIRST 我们是不用实现创建好数据库的
     
    这里大家要注意一下
    然后我们发现,我们的数据库字段已经有相应的属性了,比如FirstName 是nvarchar 30的长度 然后middleName是char 一位
    所以大家应该知道我们刚才报的错误是什么原因了
    所以我们将上面的代码修改为
    再次执行
    代码成功执行
     
    如果用户输入的名字超过30个字节,我们应该给个错误提示的
     
     [MaxLength(30, ErrorMessage = "你的名超过了30个字节")]
    public string FirstName { get; set; }
    这里的错误提示是支持国际化的,可以是其他的语言
     
    本集所有代码:
    class Program
        {
            static void Main(string[] args)
            {
                //更多资料可以登录本人的主页:www.bamn.cn 欢迎大家
                using (var personContext = new Context())
                {
                    //如果不存在数据库则创建
                    bool res = personContext.Database.CreateIfNotExists();
                    //往数据库中添加数据
                    var person = new Person
                    {
                        FirstName = "John",
                        LastName = "Doe",
                        MiddleName = "M"
                    };
                    personContext.People.Add(person);
                    personContext.SaveChanges();
                    //获取数据
                    var savedPeople = personContext.People;
                    foreach (var p in savedPeople)
                    {
                        Console.WriteLine("Last name:{0},first name:{1},id {2},mid={3}",
                        p.LastName, p.FirstName, p.PersonId,p.MiddleName);
                    }
                } 
               
                Console.ReadKey();
            }
        }
     public class Person
        {
            public int PersonId { get; set; }
            [MaxLength(30, ErrorMessage = "你的名超过了30个字节")]
            public string FirstName { get; set; }
            [MaxLength(30)]
            public string LastName { get; set; }
            [StringLength(1, MinimumLength = 1)]
            [Column(TypeName = "char")]
            public string MiddleName { get; set; }
        }
        public class Context : DbContext
        {
            public Context()
                : base("name=chapter2")
            {
            }
            public DbSet<Person> People { get; set; }
        }
    感谢你的阅读:
    本集代码下载:http://pan.baidu.com/s/1gdlgRbP
  • 相关阅读:
    字节跳动在 Go 网络库上的实践
    TCP报文段的首部格式 20字节的固定首部
    网易公开课 文件描述符 索引
    网易新闻App架构重构实践:DDD正走向流行
    货 | 携程是如何做AB实验分流的
    Pusher Channels Protocol | Pusher docs https://pusher.com/docs/channels/library_auth_reference/pusher-websockets-protocol
    避免重复提交?分布式服务的幂等性设计! 架构文摘 今天 点击蓝色“架构文摘”关注我哟 加个“星标”,每天上午 09:25,干货推送! 来源:https://www.cnblogs.com/QG-whz/p/10372458.html 作者:melonstreet
    前置时间(Lead Time),也称前置期、备货周期
    滴滴业务研发的精益实践
    DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口
  • 原文地址:https://www.cnblogs.com/maijin/p/4668070.html
Copyright © 2011-2022 走看看