Code First 可以自动根据Model 映射来创建数据库,这点非常方便。 但是按照上一节的方式创建的表,会发现,所有字符串列都是nvarchar(max),就是说每个model的属性映射的表列都是采用CodeFist 默认的设置进行创建。 这当然不科学,CodeFirst 提供了数据注释(Data Annotation) 的方式来标记每个模型的属性与表之间的映射。

  1. Convention for key : 主键映射
  2. Convention for string properties  :字符串属性映射
  3. Convention for Byte Array  : 字节数据映射
  4. Convention for Booleans :  布尔类型映射
  5. Convention for One-to-Many ReleationShips : 一对多映射
    Convention for key [Key] 标记为主键,默认是把类名+ID 的属性标记为主键
    Convention for string properties [maxLength(N)]
    [minLength(N)]

    [Required]

    字符最大长度,映射到数据库
    字符最小长度,CodeFirst 中检查,不映射到数据库
    必填
    (字符串都映射为nvarchar(n),默认设置长度映射为n=max)
    Convention for Byte Array Column(TypeName="Image") 把字节型数据映射为Image 类型,默认映射为varbinary(max)
    Convention for Booleans   sqlserver映射为bit 类型
    Convention for One-to-Many ReleationShips   外键关系,映射为 表名_主键列

1 修改Custom 的模型代码: 添加using System.ComponentModel.DataAnnotations; 引用

using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
namespace QuickStart.Model
{
   // [Table("Customer")]//存储表名Customer,默认是类名
   public class Customer
    {
       public Customer() {
           this.Orders = new List<Order>();
       }

[MaxLength(50)]
       public string CustomerID { get; set; }
       [Required] //必填
       [MaxLength(50)] //最大长度50个汉字
       public string Name { get; set; }
       public decimal Balance { get; set; }

/// <summary>
       /// 客户与订单是one or many
       /// </summary>
       public List<Order> Orders { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace QuickStart.Model
{
   public class Order
    {
       public Order() {
           this.CreateTime = DateTime.Now;
           this.OrderItems = new List<OrderItem>();
       }

public int OrderID { get; set; }
       [MaxLength(50)]
       public string Title { get; set; }
       public decimal Total { get; set; }
       public DateTime CreateTime { get; set; }

//one or many
       public List<OrderItem> OrderItems { get; set; }
       // one or one
       public Customer Customer { get; set; }
    }
}

当模型被修改后,此时如果直接运行代码,Code First 会抛出一个异常,说 要创建的OrderBD 已经存在。 默认配置下CodeFisrt 是不会自动修改的。

所以,需要添加一个初始化配置,在main函数代码开始的时候,让Code First 去检测Model 是否发生更改,如果更改,就删掉原数据库,然后重新创建一个新的数据库。 此种方式更新数据库,必须要保证数据库在其他地方为被使用,否则删除数据库时将不会成功。

1  确保配置文件中,链接字符串包含保存密码配置 Persist Security Info=true

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="OrderDB" providerName="System.Data.SqlClient"
         connectionString="server=.;uid=sa;pwd=123456;database=OrderDB;Persist Security Info=true"/>
    <!--要CodeFirst能自动维护model的更改,必须添加Persist Security Info=true 项,表示保持账号密码-->
  </connectionStrings>
</configuration>

2  在main 函数中添加 using System.Data.Entity; 引用。 (此处代码与第一小节有点变化,更改过了,不过应该可以看懂)。粗体代码为修改部分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuickStart.Model;
using System.Data.Entity;
namespace QuickStart
{
    class Program
    {
        static void Main(string[] args)
        {
            //数据库变动初始化方法一:每次检查数据库上下文,如果模型Model发生变化,就删除现有数据库,重新创建
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextAPI>());

CreateCustomer(); //创建顾客
            Console.ReadKey();
        }

private static void CreateCustomer()
        {
            using (var db = new DBContextAPI())
            {
                var customer = new Customer()
                {
                    CustomerID = "20121224001",
                    Name = "张三",
                    Balance = 1000
                };
                db.Customers.Add(customer);
                int result = db.SaveChanges();
                Console.WriteLine("追加{0}条记录成功!", result);
            }
        }
    }
}

3  执行,成功后,表结构发生变化。

转载于:https://www.cnblogs.com/iampkm/archive/2012/12/27/2835809.html

ADO.NET Entity Framework -Code Fisrt (二)相关推荐

  1. ADO.NET Entity Framework -Code Fisrt 开篇(一)

    ADO.NET Entity Framework 是微软的一套实体映射框架.发布EF4.1(Entity Framework )时,又提出了代码先行的设计理念(the code comes first ...

  2. 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...

  3. ADO.NET Entity Framework 简介

    一直对EF都是一知半解的,没有系统的了解过EF有什么样的功能,有什么具体的好处.在接下来的文章中会详细介绍EF.以下是参考MSDN上的文章,翻译并加以自己的理解得出的. ADO.NET Entity  ...

  4. ADO.NET Entity Framework Extensions 简单应用

    一.情景 如果你的项目中有返回多结果集的存储过程. 如果你的项目要和老项目中的ADO.Net共用事务. 如果你要动态的创建数据库的表. 但是你还是希望使用Entity Framework.那么继续往下 ...

  5. 利用泛型与反射更新实体(ADO.NET Entity Framework)

    自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...

  6. EF(ADO.NET Entity Framework)

    对象/关系映射框架 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.该框架曾经为.NET Framew ...

  7. Entity Framework Code First添加修改及删除单独实体

    对于一个单独实体的通常操作有3种:添加新的实体.修改实体以及删除实体. 1.添加新的实体 Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现. ...

  8. ADO.NET Entity Framework 学习(1) [ZT]

    前一段时间园子里有很多文章介绍分析了Linq To SQL,它可以说是一个简单实现的ORM,是微软针对数据和对象的阻抗不平衡的问题.C# 3.0推出一些新的特性,比如Extension Method, ...

  9. 一处 ADO.NET Entity Framework 的逻辑BUG

    这几天开始接触ADO.NET Entity Framework,突然发现一处奇怪的BUG. 首先来看这样一个目录结构: 我将EDM模型存入了一个名为"A"的目录中,然后编辑模型,设 ...

最新文章

  1. iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去
  2. Python变量作用域的规则以及如何搜索内置作用域
  3. 【80端口占用】win7下80端口被(Pid=4)占用的解决方法
  4. UNIX系统编程(1)
  5. 前台更新进度条js-4
  6. 什么是JAVA语言为什么要学习JAVA
  7. dbunit java_Java – 让DbUnit使用Hibernate事务
  8. 递归实现10进制转8进制,字符串数字互转,判断数组正逆向
  9. 为CodeLove编写插件——常用软件扫描(SoftwareToScan)
  10. 改成中文版的_lol手游怎么改成中文版?英雄联盟手游中文版更改教程
  11. 魔百盒哪款型号配置高_松下负离子吹风机怎么样哪款好?推荐型号?2020年9月松下负离子电吹风选购攻略...
  12. 公众号 -「前端攻略 开光篇」
  13. 在ECS系统中使用IJobChunk作业
  14. Hibernate的HQL中in参数设置和JdbcTemplete中的in参数
  15. bes配置oracle数据源,安装 ZFS 根文件系统(Oracle Solaris 初始安装)
  16. Golang 须知知识点
  17. cuda10.0及其驱动纯净卸载(笔记)
  18. 分享Appmakr式的简易App制作8大工具
  19. 私活利器:Java企业级快速开发框架——若依 前后端分离版本编译
  20. 创建不带参数的存储过程

热门文章

  1. 使用Retrofit时,对参数进行加密
  2. Halcon算子知识:optical_flow_mg
  3. python的全局变量能暂存数据吗_Python 中的全局变量 局部变量
  4. order by 空值排在最后_当梅根·马克尔最后一次皇室活动选择选择翡翠绿时证明她非常时髦...
  5. npm 安装less插件_Gulp 开发 HTML 静态页面和 Less 实时更新
  6. 2015 计算机考研大纲,2015年考研计算机大纲详解:操作系统
  7. drtek收音机使用说明_一百年前的便携式矿石收音机长啥样?这台1919年产品给你答案...
  8. matlab 单元,MATLAB单元阵列
  9. Java打乱牌的算法_Leetcode 384. 打乱数组 (洗牌算法)
  10. 《深度探索C++对象模型》--2 构造函数语意学