在Model里的程序,由于“只能”跟数据与商业逻辑有关,因此Model专注于如何有效地提供数据访问机制、交易环境、数据格式、商业逻辑验证等工作。
一、使用Code First创建数据模型
数据库开发模式有数据库优先开发模式(Database First Development)、模型优先开发模式(Model First Development)和程序代码优先开发模式(Code First Development)这三种。ASP.NET MVC的Model数据库开发模式为程序代码优先开发模式,使用Code First创建数据模型。在创建数据库模型时,需要了解的一些转换规则:
1.[Key]声明主键
一般情况下,Entity Framework声明主键采用设置主键名称为Id,型别为int,Code First会自动识别主键。若主键名称不是Id,则需要人为编程设计解决。如主键名为MyId,则需要在相应的MyId属性上添加Key属性,如下:
[Key] public int MyId { get ; set ; }
注:需要使用using System.ComponentModel.DataAnnotations;命名空间。
2.[Required]必填字段
若希望设置string型别字段属性为Not Null,则需要用到Required属性,如下:
[Required] public string Name { get ; set ; }
注:需要使用using System.ComponentModel.DataAnnotations;命名空间。
3.[MaxLength()]声明字段长度
声明数据长度时,需要使用MaxLength属性,如下:
[MaxLength(5)] public string Name { get ; set ; }
注:需要使用using System.ComponentModel.DataAnnotations;命名空间。
4.+?允许Null字段
像用DateTime这样的属性定义的字段,默认是Not Null的。如果要声明为Null的,则要在属性后面加?,如下:
public DateTime? CreatedOn { get ; set ; }
注:需要使用using System.ComponentModel.DataAnnotations;命名空间。
5.DatabaseGenerated声明字段默认值
在该属性上加上一个DatabaseGenerated属性,并传入DatabaseGeneratedOption.Computed参数到DatabaseGenerated,如下:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreateOn { get ; set ; }
注:需要使用using System.ComponentModel.DataAnnotations.Schema;命名空间。
6.设计模型之间的关联性(一对多关联&多对多关联)
一对多关联设计——举例说明,如下代码为两个数据模型:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcGuestBook.Models { public class Guestbook { public int Id { get; set; } public string Message { get; set; } public DateTime CreatedOn { get; set; } } public class Member { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } } }
在数据上下文类里定义两个数据模型之间的关系:增加——public DbSet<Member> Member { get; set; }
using System.Data.Entity; namespace MvcGuestBook.Models { public class MvcGuestBookContext : DbContext { public MvcGuestBookContext() : base("name=MvcGuestBookContext") { } public DbSet<Guestbook> Guestbooks { get; set; } public DbSet<Member> Member { get; set; } } }
在Guestbook和Member这两个数据模型内分别加上它们各自的“导览属性”:
Guestbook中增加——public Member Member { get; set; };
Member中增加——public ICollection<Guestbook> Guestbooks { get; set; }。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcGuestBook.Models { public class Guestbook { public int Id { get; set; } public string Message { get; set; } public DateTime CreatedOn { get; set; } public Member Member { get; set; } } public class Member { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public ICollection<Guestbook> Guestbooks { get; set; } } }
多对多关联设计——与一对多关联设计相类似,不同之处是Guestbook中增加的“导览属性”为——public ICollection<Member> Members { get; set; }。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcGuestBook.Models { public class Guestbook { public int Id { get; set; } public string Message { get; set; } public DateTime CreatedOn { get; set; } public ICollection<Member> Members { get; set; } } public class Member { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public ICollection<Guestbook> Guestbooks { get; set; } } }
二、使用Code First数据库迁移
开启程序包管理器控制台窗口,步骤如图所示:菜单栏-->工具-->库程序包管理器-->程序包管理器控制台
在程序包管理器控制台窗口输入Enable-Migrations -ContextTypeName MvcGuestBook.Models.MvcGuestBookContext实现数据库迁移,其中MvcGuestBookContext是模型设计时创建的。
Enter运行完之后,就会在指定项目中创建一个Migrations目录,该目录下有两个文档:*_InitialCreate.cs和Configuration.cs。
默认情况下,数据库不会发生自动迁移,若要实现自动迁移,可以将Configuration.cs内的Configuration()构造函数中的AutomaticMigrationsEnabled设置为true,如下所示:
namespace MvcGuestBook.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<MvcGuestBook.Models.MvcGuestBookContext> { public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(MvcGuestBook.Models.MvcGuestBookContext context) { } } }