Entity Framework(在数据库中创建表)

数据验证相关的数据注解:

特性 解释
Remote       使用 jQuery 验证插件远程验证程序的特性
FileExtension     验证文件扩展名
Compare     比较两个属性的值
RegularExpression     使用正则表达式验证
CustomValidation     自定义验证方法
DataType     指定要与数据字段关联的附加类型的名称
EmailAddress     电子邮件地址(相当于DataType(DataType.Email))
Phone     电话(相当于DataType(DataType.Phone))
CreditCard     信用卡号码(相当于DataType(DataType.CreditCard))
Url     验证URL(相当于DataType(DataType.Url))
MemberShipPassword     验证密码字段是否满足成员资格提供程序的当前密码要求

数据映射相关的数据注解:

特性   解释
Key    主键字段
Column   数据库列属性映射
NotMapped   不要创建对应的字段
Table   指定类将映射到的数据库表
ForeignKey   表示关系中用作外键的属性
DatabaseGenerated     指定属性应该映射到数据表中计算的列。也可以用于映射到自动增长的数据库表。

            指定数据库生成属性值的方式(EF不追踪属性的变化)
Required     必填字段
MaxLength     指定属性中允许的数组或字符串数据的最大长度
MinLength     指定属性中允许的数组或字符串数据的最小长度
StringLength     指定最小和最大字符长度
Range     指定数值范围

数据显示相关的数据注解: 

特性     解释
DisplayName     指定本地化的字符串(习惯用语类)
Display     指定本地化的字符串(习惯用语属性)
DisplayFormat   设置数据字段的格式
ReadOnly   指定该特性所绑定到的属性是只读属性还是读/写属性
EditAble   指示数据字段是否可编辑
HiddenInput   指示是否应将属性值或字段值呈现为隐藏的 input 元素
ScaffoldColumn   指定类或数据列是否使用基架
UIHint   指定动态数据用来显示数据字段的模板

其他:

特性 解释
DisplayColumn   将所引用的表中显示的列指定为外键列
Description   可视化设计器在引用组件成员时可以显示指定的说明
(命名空间:System.ComponentModel.DescriptionAttribute)

Category类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CodeFirstAppDemo.Models
{
    /// <summary>
    /// 产品分类表
    /// </summary>
    public class Category
    {
        /// <summary>
        /// 分类ID
        /// </summary>
        public int CategoryId { get; set; }

        /// <summary>
        /// 分类名称
        /// </summary>
        public string CategoryName { get; set; }

        /// <summary>
        /// 产品
        /// </summary>
        public List<Product> ProductList { get; set; }
    }
}

Product实体类

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFDataAnnotations.Model
{
    /// <summary>
    /// 使用Table特性指定生成的表名
    /// </summary>
    [Table("Product")]
    public class Product
    {
        //使用Key特性指示该列是主键列
        [Key]
        //使用Column特性指示生成的数据库表中的列名
        [Column("ID")]
        public int ProductId { get; set; }

        /// <summary>
        /// StringLength设置数据库表中列的长度
        /// 指示ProductName字段的最大长度是10,最小长度是2
        /// </summary>
        [StringLength(10,MinimumLength=2)]
        public string ProductName { get; set; }


        public double Price { get; set; }

        /// <summary>
        /// DataType特性指示生成的数据库表中列的数据类型
        /// </summary>
        [DataType(DataType.DateTime)]
        public DateTime ProductionTime { get; set; }
    }
}

这里需要注意两点:
1、不需要给Product.Id属性赋值,因为它对应到SQL Server表中的主键列,它的值是自动生成的,当SaveChanges执行以后,打断点就能看到返回的Product.Id已经有值了。
2、Context的实例用了using语句包装起来,这是因为DbContext实现了IDisposable接口。DbContext还包含了DbConnection的实例,该实例指向了具有特定连接字符串的数据库。在EF中合适地释放数据库连接和ADO.NET中同等重要。

数据库上下文Context类定义如下:

using EFAppointmentCreateTable.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;

namespace EFAppointmentCreateTable.EFContext
{
    /// <summary>
    /// 定义数据库上下文类,该类继承自DbContext
    /// </summary>
    public class Context:DbContext
    {
        /// <summary>
        /// 定义构造函数,继承自父类的构造函数,通过继承父类的构造函数来创建数据库
        /// 父类构造函数的参数是配置文件中配置的数据库连接字符串
        /// </summary>
        public Context()
            : base("CodeFirstApp") { } //实体属性集合 根据实体名称的复数形式生成数据库的表名 // 生成的表名是Products 和属性名Products无关 // 即使把属性名改成Product,生成的表名还是Products 约定大于配置
     public DbSet<Category> Categorys { get; set; }
     public DbSet<Product> Products { get; set; }
    }
}

在这里,DbContext是所有基于EF的上下文基类,通过它可以访问到数据库中的所有表。上面的代码中调用了父类的构造函数,并且传入了一个键值对,键是name,值是CodeFirstApp,这个键值对是定义在应用程序的配置文件中的,取决于你的应用程序类型,可能是app.config或者web.config。在我们的控制台应用程序中就是app.config。

在app.config文件的configuration节点下(不要在第一个节点下,否则会报错)添加:

 <connectionStrings>
     <add name="CodeFirstApp" connectionString="Server=.;Database=CodeFirstApp;User Id=sa;Password=test" providerName="System.Data.SqlClient"/>
 </connectionStrings>

在SQL数据库中创建数据库DbConnection:

using CodeFirstAppDemo.EFDbContext;
using CodeFirstAppDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CodeFirstAppDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 使用数据库上下文Context
            using (var context = new Context())
            {
                 // 如果数据库不存在,则调用EF内置的API创建数据库
                if (context.Database.CreateIfNotExists())
                {
                    Console.WriteLine("数据库创建成功!");
                }
                else
                {
                    Console.WriteLine("数据库已存在");
                }

                #region EF 添加数据
                //添加数据
                var cate = new List<Category> {
                   new Category{
                    CategoryName="文学类",
                    ProductList=new List<Product>{
                          new Product
                   {
                     ProductName="百年孤独",
                     Price=37.53m,
                     PublicDate=new DateTime(2011,6,1)

                   },
                     new Product
                   {
                     ProductName="老人与海",
                     Price=37.53m,
                     PublicDate=new DateTime(2010,6,1)

                   }
                      }
                   },
                    new Category{
                    CategoryName="计算机类",
                    ProductList=new List<Product>{
                          new Product
                   {
                    ProductName="C#高级编程第九版",
                     Price=48.23m,
                     PublicDate=new DateTime(2016,2,8)
                   },
                    new Product
                   {
                     ProductName="Oracle从入门到精通",
                     Price=27.03m,
                     PublicDate=new DateTime(2014,7,9)
                   }
                      }
                   }

                };

                //将创建的集合添加到上下文中
                context.Categorys.AddRange(cate);
                //调用SaveChanges()方法,将数据插入到数据库
                context.SaveChanges();
                #endregion
            }

            Console.ReadKey();
        }
    }
}

 

posted @ 2021-12-07 22:22  裳裳者华  阅读(332)  评论(0编辑  收藏  举报