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

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

publicclassMusicStoreDB : DbContext
{
publicDbSet<Album> Albums { get; set; }
publicDbSet<Genre> Genres { get; set; }
publicDbSet<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(newDropCreateDatabaseAlways<MusicStoreDB>());

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

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

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中添加

Database.SetInitializer(newMisicStoreDbInitializer());

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

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

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

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

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

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类里面的代码初始化数据

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);

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

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

以上方面会有改动过数据库的可能性,数据迁移(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/

【转】MVC Model建模及Entity Framework Power Tool使用的更多相关文章

  1. 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)

    从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...

  2. Visual Studio 2015上安装Entity Framework Power Tools

    Entity Framework Power Tools是个非常好用的EF Code First插件.通过它能够非常简单地生成和数据库结构匹配的model和dbcontext代码.使用的方法,这里有介 ...

  3. 代码生成工具——Entity Framework Power Tools

    Entity Framework Power Tools是VS上的一个根据数据库生成Model的Code First映射工具.在VS里面右键即可看到.什么,没有? 别慌,可以单独下载的,见 https ...

  4. Entity Framework Power Tools安装和使用

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. 大致来说,这个工具 ...

  5. Entity Framework Code-First(23):Entity Framework Power Tools

    Entity Framework Power Tools: Entity Framework Power Tools (currently in beta 3) has been released. ...

  6. 自己动手,让Entity Framework Power Tools在VS2015重放光彩

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. VS Galler ...

  7. VS2015下安装Entity Framework Power Tools

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. 怀着激动的心情安装 ...

  8. Code First配合Entity Framework Power Tools Beta 4使用

    基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools(一个Code First反向工程工具).只要 ...

  9. VS2015配置Entity Framework Power Tools Bate4,还有一些使用与注意的地方

    今天使用vs2015重新安装了这个名为Entity Framework Power Tools的插件,由于它只支持到2013,因此需要进行一些操作方能使用 下面是一些参考文档 http://www.c ...

随机推荐

  1. Java异常:选择Checked Exception还是Unchecked Exception?

    http://blog.csdn.net/kingzone_2008/article/details/8535287 Java包含两种异常:checked异常和unchecked异常.C#只有unch ...

  2. eclipse-->run as --> maven test 中文乱码

    其有一个配置参数forkMode,默认为once,即表示每次运行test时,新建一个JVM进程运行所有test. 这可能会导致乱码问题.首先将forkMode设置为never,即不新建.再运行mvn ...

  3. IEqualityComparer的使用

    当我们用Linq操作我们自定义的对像数组时,我们会发现有些方法直接使用的话根本不起作用,比如:Distinct.Except.Intersect等扩展方法. 对于我们自定义的对象的比较,我们必须实现I ...

  4. RabbitMq初探——消息确认

    消息确认机制 前言 消息队列的下游,业务逻辑可能复杂,处理任务可能花费很长时间.若在一条消息到达它的下游,任务刚处理了一半,由于不确定因素,下游的任务处理进程 被kill掉啦,导致任务无法执行完成.而 ...

  5. Neutron FWaaS 原理

    理解概念 Firewall as a Service(FWaaS)是 Neutron 的一个高级服务.用户可以用它来创建和管理防火墙,在 subnet 的边界上对 layer 3 和 layer 4 ...

  6. WPF ControlTemplate 动画板 结束事件不触发

    解决此问题很简单 将Storyboard单独提取出来及可 给定Key名称,然后在触发器中的BeginStoryboard的storyboard绑定即可 <!--单独提取并设置Xkey--> ...

  7. Remoteland HDU - 4196

    题意: 给出一个n,在[1, n] 中挑选几个不同的数相乘,求能的到的最大完全平方数 解析: 最大的肯定是n!, 然后n!不一定是完全平方数 (我们知道一个完全平方数,质因子分解后,所有质因子的质数均 ...

  8. 干货 | Elasticsearch Nested类型深入详解(转)

    https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...

  9. Python之scrapy框架之post传输数据错误:TypeError: to_bytes must receive a unicode, str or bytes object, got int

    错误名:TypeError: to_bytes must receive a unicode, str or bytes object, got int 错误翻译:类型错误:to_bytes必须接收u ...

  10. POJ1095 Trees Made to Order(JAVA)

    这题用到了卡特兰数,比较麻烦.关于卡特兰数的基本概念百度一下你就知道. 使用卡特兰数对数组元素进行分组之后,需要具体计算一下要求的是第几组的第几个数,然后向下递归. 首先来看利用卡特兰数分组: 从1开 ...