【轉】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/

相關文章
相關標籤/搜索