引言:
从第一开始,我就想,我们要想建一整套数据库,一个人来注册了,我们就可以给它注册一个库,这个库中所有的表结构,都是先前就准备好了的,我想,这个真的用EF的CodeFirst实现就最好了。因为我们的所有的ViewModel都是齐全的,用ModelFirst是需要画实体关联图的,用DBFirst就不用说了。
实现思路:
前期用我们所有的Model实体都是很好收集的,因为代码都是事先写好的,大概有100多个实体,这些实体就要满足;一旦有人进行注册,我们就给他生成这么多表的一个数据库。原理很简单,我们都知道EF实现这个的时候,用CodeFirst最合适不过了。
然后就是实现步骤,其实所有实现数据库连接和操作无非就是三步:连接、准备执行语句、执行。
其实用CodeFiist的这三步就是比ODBC进行了封装,使用户操作更加少的代码,只要写实体和Context(上下文)就可以了。实现起来比ODBC要简单的多。
我一开始一直以为EF是只读Web.config的,而我们都知道,Web.config文件的ConnectString节点是可以进行运行时的修改的,但是在我们修改了,但是问题出在Web.config只在系统开启的时候,才会加载出来。我试过了很多方法去解决web.config只在系统开启的时候加载这个问题,却忽略了一个真正能解决这个问题的方法:EF是不是只读Web.config?
这个问题还是江霄解决的,其实EF不是只读Web,config文件的。我们可以看看DbContext:
<span style="font-size:18px;">
public DbContext(string nameOrConnectionString);</span><span style="font-size:18px;">
</span>
DbContext是EF给我们封装的访问数据库的方法,我们可以看到DbContext中的参数是有两种的一种是name 一种是ConnectString,也就是说,我们可以传一个数据库的名称,也可以穿一个数据库连接字符串,这样我们就可以不用讲数据库连接字符串放在Web,cofig中了。
这个真心太棒了,我们在解决问题的时候,一定要思维很缜密,为一方面我们要多看看底层的封装,其实EF就是ODBC等底层的数据库连接进行了封装,所有我们看起来很高大上的东西,其实都是对最基本的东西进行封装形成的,很多东西其实都不是新的东西。
代码实现:
1、建库
这里我要将一个库,库中有两个表:
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace WebDemo.Models
{
[Serializable]
public class Student
{
[StringLength(32)]
public virtual string SName { get; set; }
[StringLength(32)]
public virtual string Address { get; set; }
[Key]
public virtual int Id { get; set; }
}
}</span>
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace WebDemo.Models
{
[Serializable]
public class UserInfo
{
public string UName { get; set; }
[Required]
[MaxLength(32)]
public string UPwd