前面两篇文章介绍了DataBase-First例子,这里就介绍Code-First。

  个人简单理解:就是在程序中编写代码,然后在数据库中生成相应的表、字段、约束等等。听上去蛮神奇的。Now,begin。

  这里为了方便,还是用控制台,VS2010与Sql 2005。

  为了学习EF Code-First 方法,我们首先需要添加引用,EntityFramework.dll,点击下载

  由于是控制台程序,我们需要在App.config文件中写好数据库连接字符串(web程序不需要)。 

 <add name="TestStudent" connectionString="data source=(local);Initial Catalog=TestStudent;User Id=sa;Password=123456;
persist security info=True;" providerName="System.Data.SqlClient" />

  这个数据库中,有用户表User,以及这些学生的成绩表Grade,一对多的关系。

  首先先看下面的代码

 public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int UserId { get; set; }
public string UserName { get; set; } public virtual ICollection<Grade> Grade { get; set; }
} public partial class Grade
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int GradeId { get; set; }
public string SourceName { get; set; }
public double SourceGrade { get; set; }
public int GUserId { get; set; } [ForeignKey("GUserId")]
public virtual User User { get; set; }
}

  按照Code-First规则,一旦运行此程序,就会生成表名为User、Grade的数据表,User表里面有Id,UserId,UserName三个字段,其中Id是User表的主键,并且是自增。如果你不希望此数据表名为User,可以通过在类名前加上[Table("StudentInfo")],则生成的数据表名为StudentInfo。

   其中

   代码    public virtual ICollection<Grade> Grade { get; set; } ---》表示该列表延迟加载。

    [ForeignKey("GUserId")]
        public virtual User User { get; set; }     -----》表示列GUserId是User表的外键。

    那么,如何创建数据库呢,如下代码 

public class StudentDbContext : DbContext
{
public StudentDbContext()
: base("name=TestStudent")
{
this.Database.CreateIfNotExists();
}
public IDbSet<User> User { get; set; }
public IDbSet<Grade> Grade { get; set; }
}

  这里,我们写了一个类 StudentDbContext ,继承类DBContext。

  其中 DbContext : IDisposable, IObjectContextAdapter

接口 IObjectContextAdapter的原型

   public interface IObjectContextAdapter
       {
           System.Data.Objects.ObjectContext ObjectContext { get; }
     }

  因此,ObjectContext是师祖。

  这里需要注意一下,name="XXX"的名称要与连接数据库的名称一样,否则可能会有小问题出现。

  “this.Database.CreateIfNotExists()”表示如果如果不存此数据库,就去创建数据库。

  IDbSet原型如下 

 public interface IDbSet<TEntity> : IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable where TEntity: class
{
TEntity Add(TEntity entity);
TEntity Attach(TEntity entity);
TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity: class, TEntity;
TEntity Create();
TEntity Find(params object[] keyValues);
TEntity Remove(TEntity entity); ObservableCollection<TEntity> Local { get; }
}

  在下面,我们就会用到这些方法去操作数据库的内容。

  1、添加数据

  代码如下

    //使用DBContext 里自带的方法操作数据库 
   var User = new User() { UserId = , UserName = "刘德华" };
db.User.Add(User);
db.SaveChanges();

//直接使用Sql 语句操作数据库
  db.Database.ExecuteSqlCommand("insert into Users(UserId,UserName) values({0},{1})",
new object[] { , "xianrongbin" });

  2、查询数据

          var ListUsers = db.User.ToList<User>();

                //var ListUsers = db.Database.SqlQuery<User>("select * from Users").ToList<User>();
foreach (var item in ListUsers)
{
Console.WriteLine(item.UserName);
//var Grades = db.Grade.Where(a=>a.GUserId==item.UserId); var Grades = from a in db.Grade
where a.GUserId == item.UserId
select a;
foreach (var grade in Grades)
{
Console.WriteLine(grade.SourceName + " " + grade.SourceGrade);
}
}

  当然,因为两张表存在主外键的关系,我们可以使用类似Sql语句中的join语法,查询数据,代码如下

var query = from s in db.User
join c in db.Grade
on s.UserId equals c.GUserId
//where s.UserId == 1
select new
{
SID=s.UserId,
SName=s.UserName,
KMName=c.SourceName,
KMScore=c.SourceGrade
};
foreach (var item in query)
{
Console.WriteLine("学生{0} 的{1}成绩是{2}",item.SName,item.KMName,item.KMScore);
}

  3、修改数据

          int userId = ;
User UserModel = db.User.Find(userId);
UserModel.UserName = "陈小春"; db.Entry(UserModel).State = EntityState.Modified;
db.SaveChanges();
//db.Database.ExecuteSqlCommand("update Users set UserName='刘德华' where Id=2");

  

  4、删除数据

          User UserModel = db.User.Find();
if (UserModel != null)
{
db.Entry(UserModel).State = EntityState.Deleted;
db.SaveChanges();
}

  

  OK,Code-First例子这里计算讲完了。

  

 

MVC学习(三)Code-First Demo的更多相关文章

  1. Spring MVC 学习 之 - 配置简单demo

    1.环境参数: Maven:3.1.1 JDK  :1.6 2.项目文件结构图: 3.各文件配置: 3.1. pom.xml <project xmlns="http://maven. ...

  2. MVC学习三:Razor视图引擎

    1.Razor视图引擎,主要是把View的HTML代码编译到View视图类对象中

  3. .NET MVC 学习笔记(三)— MVC 数据显示

    . NET MVC 学习笔记(三)—— MVC 数据显示 在目前做的项目中,用的最多的数据展示控件就是table展示(说不是的请走开,不是一路人),以下详细阐述下table的使用方法. 先看效果: 上 ...

  4. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  5. ASP.NET MVC学习系列(二)-WebAPI请求

    继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...

  6. ASP.NET MVC学习系列(二)-WebAPI请求(转)

    转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  7. (转)ASP.NET MVC 学习第一天

    天道酬勤0322   博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习as ...

  8. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  9. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  10. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

随机推荐

  1. (笨方法)利用stat函数实现ls -l filename

    学习了一段时间的Linux了,但是我感觉我做不出来啥子,后头选择利用系统IO函数实现命令,先从ls走起吧.先来看看ls -l filename给我们显示了什么吧 : 可以看到,一共八项:文件类型.用户 ...

  2. linux 内核中一个全局变量引发的性能问题

    为了调试一个功能,在一个内核模块中,增加了一个全局变量,用来统计自有skb池的申请情况. 因为是临时增加,所以没有考虑性能,一开始只是一个fail的统计,数量不多,也不太考虑是否有计数丢失的情况,毕竟 ...

  3. jQuery中事情的动态绑定

    在jQuery的开发过程中,我们往往需要处理各种事件,例如click(),hover()等.在jQuery的API中,我们可以使用不同的方法来将这些事件绑定到特定的元素中.今天这篇文章中,我们将要介绍 ...

  4. ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量)

    ArcGIS案例学习笔记-栅格数据分区统计(平均高程,污染浓度,污染总量,降水量) 联系方式:谢老师,135-4855-4328,xiexiaokui@qq.com 目的:针对栅格数据,利用多边形面要 ...

  5. C++ CSTRINGLIST用法

    CStringList类成员   构造 CStringList 构造一个空的CString对象列表 首/尾访问 GetHead 返回此列表(不能是空的)中头部的元素 GetTail 返回此列表(不能是 ...

  6. windows7 IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET

    IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET windows7,部署在本地的IIS7里以后,结果不能访问承载SL的.aspx页面,而如果用.html承载则可以访问. 亲测可用修复办法 ...

  7. Windows组件下载地址

    Windows下载中心 http://www.microsoft.com/zh-cn/download/default.aspx IE10下载地址 http://www.microsoft.com/z ...

  8. spring .cloud ------------java.lang.RuntimeException: com.netflix.client.ClientException,Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters

    1.问题的发生 Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connect ...

  9. Flex Basis与Width的区别

    [Flex Basis与Width的区别] Flex Items的应用准则 content –> width –> flex-basis (limted by max|min-width) ...

  10. Opengl库函数列表

    http://www.cnblogs.com/GameDeveloper/archive/2012/01/07/2315867.html