未经授权,不得转载
先…写代码
Code First是一个比较适合的名字:先写代码,剩下的再说。让我们看看基本的默认功能而不用考虑所有的你可能需要用到的场景。书中剩下的部分专门会说到。
我们不指望你去重新创建第一章所展示的例子。这个代码例子是一个总体概况的展现,而不是作为整个的介绍。从第二章开始,你们找到很多这样的介绍。他们会在一种你能够跟着使用Visual Studio的方式下描述,如果你愿意的话,完全可以将其制作出来。
当然,第一件事情是你需要一些代码和描述业务逻辑的类。下面的例子是一个非常小的例子——病人和病人所拜访的兽医。
例1-1, 描述了这个应用的三种类——Patient,Visit和AnimalType应用类
using System;
using System.Collections.Generic;
namespace ChapterOneProject
{
class Patient
{
public Patient()
{
Visits = new List<Visit>();
}
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public DateTime BirthDate
{
get;
set;
}
public AnimalType AnimalType
{
get;
set;
}
public DateTime FirstVisit
{
get;
set;
}
public List<Visit> Visits
{
get;
set;
}
}
class Visit
{
public int Id
{
get;
set;
}
public DateTime Date
{
get;
set;
}
public String ReasonForVisit
{
get;
set;
}
public String Outcome
{
get;
set;
}
public Decimal Weight
{
get;
set;
}
public int PatientId
{
get;
set;
}
}
class AnimalType
{
public int Id
{
get;
set;
}
public string TypeName
{
get;
set;
}
}
}
Code First的核心是约定——规则的概念,CodeFirst会用这些约定和规则去构建基于你的类的模型。例如,EntityFramework需要一个类必须有一个主键属性。CodeFirst有一个约定如果它寻找到一个名为Id或者以Id组合的类名(例如PatientId),那么它就会自动地为它配置为主键。如果没有以此规约找到对应的属性,它会抛出一个运行时异常,这个异常会告诉你没有主键。其他的预定的类型决定了默认的一个字符串的长度或者当你有一个从其他地方继承过来的类,那么EntityFramework应该期望的默认表结构。
如果CodeFirst只是仅仅依赖你工作的类,那么将会是十分有限的。但是CodeFirst没有强制要求你去设计你的类使之符合它们的需要,相反,这个约定的存在使得CodeFirst能够自动去把握一些常见的场景。如果你的类开始跟着这样的约定,CodeFirst不再需要从你那获得任何的信息。EntityFramework会直接与你的类进行沟通,如果你不遵循这样的规定,你也能通过CodeFirst的其他配置选项去提供一些额外的信息使之能够让你的类能够被CodeFirst解释。
在例1-1的三个雷中,每个类的Id属性都被认为是主键,我们让Code First跟这些类直接工作而不需要额外的配置