hello

MVC3 Model建模

MVC如使用Code-First代码优先约定,先建实体类,再根据实体类创建数据库。

在创建实体类后,新建一个数据上下文类,如下:

public class MusicStoreDB : DbContext
    {
        public DbSet<Album> Albums { get; set; }

        public DbSet<Genre> Genres { get; set; }

        public DbSet<Artist> Artists { get; set; }
    }

其中MusicStoreDB继承DbContext类,该类为EntityFramework生成数据表的类。

然后在web.config里面写好连接字符串:

<add name="MusicStoreDB" connectionString="Data Source=localhost;Integrated Security=true;Initial Catalog=MusicStore;User ID=sa;pwd=******" providerName="System.Data.SqlClient"></add>

其中add里面的name值一定要和数据上下文类相同,即“MusicStoreDB”。

 

MVC3数据库创建有几种方式:

1、如果需要应用程序每次重新启动时都重新创建新的数据库,在global.asax.cs的Application_Start()中添加:

Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>());

2、每次启动时重新创建新的数据库,并且初始化一些数据

先新建MisicStoreDbInitializer类,改类继承DropCreateDatabaseAlways类。

public class MisicStoreDbInitializer :DropCreateDatabaseAlways<MusicStoreDB>

    {

        protected override void Seed(MusicStoreDB context)

        {

            context.Artists.Add(new Artist { Name="Al Di Meola"});

            context.Genres.Add(new Genre { Name="Jazz"});

            base.Seed(context);

        }

然后在global.asax中添加

Database.SetInitializer(new MisicStoreDbInitializer());

即可实现每次启动程序新建数据库并且初始化一些数据。

3、当有类的字段发生改变时才重新创建新的数据库,在global.asax.cs的Application_Start()中添加:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MusicStoreDB>());

注意:如果连接字符串串中没有加Integrated Security=true;则会出现如下错误“报此操作要求连接到 'master' 数据库。无法创建与 'master' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据。请提供未打开的连接。”加上之后则会正常工作。

4、当类结构发生改变时重新创建新的数据库,并且初始化一些数据

 public class MisicStoreDbInitializer :DropCreateDatabaseIfModelChanges<MusicStoreDB>
    {
        protected override void Seed(MusicStoreDB context)
        {
            context.Artists.Add(new Artist { Name="Al Di Meola"});
            context.Genres.Add(new Genre { Name="Jazz"});
            base.Seed(context);
        }
    }

在global中添加:

Database.SetInitializer<MusicStoreDB>(new MisicStoreDbInitializer());

或者Database.SetInitializer(new MisicStoreDbInitializer());

即可实现当有表结构发生改变时重新创建数据库并且执行MisicStoreDbInitializer类里面的代码初始化数据

5、以上4中方式在开发中都是不可行的。实际开发中数据表的结构改变时有发生,不可能每次都重新创建数据库,这样对于数据备份还原显得麻烦。

实际开发中,我们只是单纯修改表字段,而数据不会动。第五种方法则为此实现:

先直接再Artists表中新增CreateTime字段,然后在项目的Artist类中也新增CreateTime字段:public virtual DateTime? CreateTime { get; set; }

这时如果我们运行程序,因为Artist类中的代码有改动,程序会出现如下错误:

The model backing the 'MusicStoreDB' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

 

说数据上下文在数据库创建后发生了改变。

这时如果我们可以在Global的Application_Start()中取消数据上下文的检查,即将数据初始化设为Null,如:

Database.SetInitializer<MusicStoreDB>(null);

则可实现同时修改表和类中字段,而数据不动。

 

posted @ 2013-01-11 23:51  B追风少年  阅读(1042)  评论(0编辑  收藏  举报

hello too