【转】MVC Model建模及Entity Framework Power Tool使用

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

在建立实体类后,新建一个数据上下文类,以下:web

publicclassMusicStoreDB : DbContext 
{ 
publicDbSet<Album> Albums { get; set; } 
publicDbSet<Genre> Genres { get; set; } 
publicDbSet<Artist> Artists { get; set; } 
}
 

 

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

而后在web.config里面写好链接字符串:app

<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”。ide

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

工具

一、若是须要应用程序每次从新启动时都从新建立新的数据库,在global.asax.cs的Application_Start()中添加:性能

Database.SetInitializer(newDropCreateDatabaseAlways<MusicStoreDB>());

二、每次启动时从新建立新的数据库,而且初始化一些数据学习

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

publicclassMisicStoreDbInitializer :DropCreateDatabaseAlways<MusicStoreDB>
{ 
protectedoverridevoidSeed(MusicStoreDB context) 
{ 
context.Artists.Add(newArtist { Name="Al Di Meola"});
 context.Genres.Add(newGenre { Name="Jazz"}); base.Seed(context); 
}
}

 

而后在global.asax中添加this

Database.SetInitializer(newMisicStoreDbInitializer());

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

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

Database.SetInitializer(newDropCreateDatabaseIfModelChanges<MusicStoreDB>());

注意:若是链接字符串串中没有加Integrated Security=true;则会出现以下错误“报此操做要求链接到 'master' 数据库。没法建立与 'master' 数据库之间的链接,这是由于已打开原始数据库链接,而且已从链接字符串中删除凭据。请提供未打开的链接。”加上以后则会正常工做。

四、当类结构发生改变时从新建立新的数据库,而且初始化一些数据

publicclassMisicStoreDbInitializer :DropCreateDatabaseIfModelChanges<MusicStoreDB>
{ 
protectedoverridevoidSeed(MusicStoreDB context) 
{ 
context.Artists.Add(newArtist { Name="Al Di Meola"}); 
context.Genres.Add(newGenre { Name="Jazz"}); base.Seed(context); 
} 
}

 

在global中添加:

Database.SetInitializer<MusicStoreDB>(newMisicStoreDbInitializer()); 或者Database.SetInitializer(newMisicStoreDbInitializer());

便可实现当有表结构发生改变时从新建立数据库而且执行MisicStoreDbInitializer类里面的代码初始化数据

五、以上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);

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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上方面会有改动过数据库的可能性,数据迁移(http://www.cnblogs.com/kenshincui/p/3286103.html)不方便,建议仍是用老方法,先在数据库上建好表后,再经过Entity Framework Power Tool这个工具生成Model!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好像蛮长时间没有新文章带给你们了。前几天出差再加上忙着公司里的活儿,几乎都没时间上博客园了。今天正好有些时间,为你们简单介绍EF产品组新发布的一个牛逼的小工具——EF
Power Tool(翻译的话,好像就是牛逼工具哦?)
下次会为你们深刻解析这个小工具。  最早看到这个工具是在EF产品组最新的博客文章上,http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx。粗略读了下,感受很酷,立刻下载下来试了试,果真很酷,http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/

大体来讲,这个工具备这样几个功能:

1) 按照现有数据库结构,生成Code First POCO class、DbContext class和相应的mapping class。

2) 以designer模式或XML模式查看POCO class对应的Entity Data Model (edmx) 。

3) 查看Entity Data Model所对应的DDL。

4) 生成EF Generated View提升EF性能。

 

一块儿来体验下。固然请先下载安装这个小工具,安装前必须先安装EF4.1

首先在数据库端建立两个表Parent和Child,存在一对多的关系。

 

建立一个C#项目,并右击项目名。在弹出的菜单中选择Entity Framework –> Reverse Engineer Code
First。

 

接着须要选择相应的数据库链接:

 

接着,神奇的一幕发生了。小工具帮助咱们生成了很多class:

 

相应的POCO class, DbContext class和mapping fluent API都自动生成了,真是过轻松了。这样大大方便了咱们学习EF
4.1的相关fluent API。

 public class Parent
{
public Parent()
{
this.Children = new List<Child>();
}
public int ParentID { get; set; }
public string Name { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
 
 public class EFToolContext : DbContext
{
static EFToolContext()
{
Database.SetInitializer<EFToolContext>(null);
}
public DbSet<Child> Children { get; set; }
public DbSet<Parent> Parents { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Configurations.Add(new ChildMap());
modelBuilder.Configurations.Add(new ParentMap());
}
}

 public class ParentMap : EntityTypeConfiguration<Parent>
{
public ParentMap()
{
// Primary Key
this.HasKey(t => t.ParentID);
// Properties
this.Property(t => t.ParentID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.Property(t => t.Name)
.IsRequired()
.HasMaxLength(50);
// Table & Column Mappings
this.ToTable("Parent");
this.Property(t => t.ParentID).HasColumnName("ParentID");
this.Property(t => t.Name).HasColumnName("Name");
}
}

拥有了这些class以后,咱们还能够经过小工具来查看相应的Entity Data Model以及对应的DDL。更牛的是,小工具还能够为咱们生产EF
Generated View的代码,以提升咱们使用EF和Code First时的性能。

 

值得一提的是,这里的Entity Data Model,Entity Data Model XML和Entity Data Model
DDL都是只读的,它们被生成在C:\Users\[username]\AppData\Local\Temp\文件夹下。

 

在选择Optimize Entity Data Model以后,小工具会为你的项目增长一个.View.cs文件,期中就包括了Generated Views的代码。有关Generated View的更详细信息,请参见:http://msdn.microsoft.com/en-us/library/bb896240.aspx

是否是以为这个工具很酷呢?赶忙下载吧! http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/

相关文章
相关标签/搜索