ADO.NET Entity Framework -Code Fisrt (二)
Code First 可以自動(dòng)根據(jù)Model 映射來創(chuàng)建數(shù)據(jù)庫(kù),這點(diǎn)非常方便。 但是按照上一節(jié)的方式創(chuàng)建的表,會(huì)發(fā)現(xiàn),所有字符串列都是nvarchar(max),就是說每個(gè)model的屬性映射的表列都是采用CodeFist 默認(rèn)的設(shè)置進(jìn)行創(chuàng)建。 這當(dāng)然不科學(xué),CodeFirst 提供了數(shù)據(jù)注釋(Data Annotation) 的方式來標(biāo)記每個(gè)模型的屬性與表之間的映射。
| Convention for key | [Key] | 標(biāo)記為主鍵,默認(rèn)是把類名+ID 的屬性標(biāo)記為主鍵 |
| Convention for string properties | [maxLength(N)] [minLength(N)] [Required] | 字符最大長(zhǎng)度,映射到數(shù)據(jù)庫(kù) 字符最小長(zhǎng)度,CodeFirst 中檢查,不映射到數(shù)據(jù)庫(kù) 必填 (字符串都映射為nvarchar(n),默認(rèn)設(shè)置長(zhǎng)度映射為n=max) |
| Convention for Byte Array | Column(TypeName="Image") | 把字節(jié)型數(shù)據(jù)映射為Image 類型,默認(rèn)映射為varbinary(max) |
| Convention for Booleans | ? | sqlserver映射為bit 類型 |
| Convention for One-to-Many ReleationShips | ? | 外鍵關(guān)系,映射為 表名_主鍵列 |
1 修改Custom 的模型代碼: 添加using System.ComponentModel.DataAnnotations; 引用
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
namespace QuickStart.Model
{
?? // [Table("Customer")]//存儲(chǔ)表名Customer,默認(rèn)是類名
?? public class Customer
??? {
?????? public Customer() {
?????????? this.Orders = new List<Order>();
?????? }
?????? [MaxLength(50)]
?????? public string CustomerID { get; set; }
?????? [Required] //必填
?????? [MaxLength(50)] //最大長(zhǎng)度50個(gè)漢字
?????? 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; }
??? }
}
?
當(dāng)模型被修改后,此時(shí)如果直接運(yùn)行代碼,Code First 會(huì)拋出一個(gè)異常,說 要?jiǎng)?chuàng)建的OrderBD 已經(jīng)存在。 默認(rèn)配置下CodeFisrt 是不會(huì)自動(dòng)修改的。
所以,需要添加一個(gè)初始化配置,在main函數(shù)代碼開始的時(shí)候,讓Code First 去檢測(cè)Model 是否發(fā)生更改,如果更改,就刪掉原數(shù)據(jù)庫(kù),然后重新創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。 此種方式更新數(shù)據(jù)庫(kù),必須要保證數(shù)據(jù)庫(kù)在其他地方為被使用,否則刪除數(shù)據(jù)庫(kù)時(shí)將不會(huì)成功。
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能自動(dòng)維護(hù)model的更改,必須添加Persist Security Info=true 項(xiàng),表示保持賬號(hào)密碼-->
? </connectionStrings>
</configuration>
2? 在main 函數(shù)中添加 using System.Data.Entity; 引用。 (此處代碼與第一小節(jié)有點(diǎn)變化,更改過了,不過應(yīng)該可以看懂)。粗體代碼為修改部分
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)
??????? {
??????????? //數(shù)據(jù)庫(kù)變動(dòng)初始化方法一:每次檢查數(shù)據(jù)庫(kù)上下文,如果模型Model發(fā)生變化,就刪除現(xiàn)有數(shù)據(jù)庫(kù),重新創(chuàng)建
???????? ?? Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DBContextAPI>());
??????????? CreateCustomer(); //創(chuàng)建顧客
??????????? 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? 執(zhí)行,成功后,表結(jié)構(gòu)發(fā)生變化。
轉(zhuǎn)載于:https://www.cnblogs.com/iampkm/archive/2012/12/27/2835809.html
總結(jié)
以上是生活随笔為你收集整理的ADO.NET Entity Framework -Code Fisrt (二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 得到ios设备的屏幕尺寸信息
- 下一篇: iOS crash 崩溃问题的追踪方法