我不懂升key降key什么意思,比如C#6降2降了一个keyy是什么

8918 条评论分享收藏感谢收起赞同 6516 条评论分享收藏感谢收起16K622 条评论分享收藏感谢收起赞同 61641 条评论分享收藏感谢收起创建初始模型和数据库
  在开始使用迁移(Migrations)之前,我们需要一个 Project 和一个 Code First Model, 对于本文将使用典型的 Blog 和 Post 模型
创建一个新的控制台应用程序 MigrationsDemo;
添加最新的&EntityFramework 到项目
Tools && Library Package Manager && Package Manager Console;
运行命令 Install-Package EntityFramework  
&&创建&Blog.cs 和 DbContext&的派生类&BlogContext.cs
public class Blog
public int BlogId { get; set; }
public string Name { get; set; }
public class BlogContext : DbContext
public DbSet&Blog& Blogs { get; set; }
  更改 Program.cs 以调用
static void Main(string[] args)
using (var db = new BlogContext())
db.Blogs.Add(new Blog { Name = "Another Blog" });
db.SaveChanges();
foreach (var blog in db.Blogs)
Console.WriteLine(blog.Name);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
  运行查看结果
  发现如上错误"CREATE DATABSE permission denied in databse 'master'"
  我们在&BlogContext 上的无参构造函数上添加诊断代码并设置调试断点
System.Diagnostics.Debug.Write(Database.Connection.ConnectionString);
  再次运行
  我们注意到 Data Scource 竟然是 .\\SQLEXPRESS 而不是我们想要的 localDB&, 这是因为:
如果我们安装了 SQL Express,那么&database&将会安装在&local SQL Express instance,否则 Code First&才将尝试使用 localDB;
SQL Express&总是具有优先权,只要安装了它
  知道了原因我们就好解决了:
如果想继续使用&SQL Express,那么就配置相应地权限,请参考&http://odetocode.com/Blogs/scott/archive//a-troubleshooting-guide-for-entity-framework-connections-amp-migrations.
如果想改用 localDB,&只需在.config 配置即可(放在&configSections 节点后面)
&connectionStrings&
&add name="BlogContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=BlogCIntegrated Security=SSPI;" providerName="System.Data.SqlClient"/&
&/connectionStrings&
  再次运行就行了,让我们看一下后台生成的数据库
  我们对模型 Blog 做一些更改:增加一个 Url 属性&
public string Url { get; set; }
  我们此时再次运行程序,发现如下错误
  'InvalidOperationException' was unhandled.&The model backing the 'BlogContext' context has changed since the database was created. Consider using Code First Migrations to update the database (&)
  正如错误消息提示的那样,是时候使用&Code First Migrations,第一步是运行如下的命令:
在&Package Manager Console 下运行命令&Enable-Migrations
  这个命令将在项目下创建文件夹&Migrations&
The Configuration class 这个类允许你去配置如何迁移,对于本文将使用默认的配置(在本文中因为只有一个 Context, Enable-Migrations&将自动对&context type 作出适配);
An InitialCreate migration&(本文为&431_InitialCreate.cs)这个迁移之所以存在是因为我们之前用 Code First 创建了数据库, 在启用迁移前,scaffolded migration 里的代码表示在数据库中已经创建的对象,本文中即为表 Blog (列 BlogId 和 Name). 文件名包含一个&timestamp 以便排序(如果之前数据库没有被创建,那么&InitialCreate migration 将不会被创建,相反,当我们第一次调用 Add-Migration 的时候所有表都将归集到一个新的 migration&中)
多个实体锁定同一数据库
  当使用 EF6 之前的版本时,只会有一个 Code First Model 被用来生成/管理数据库的 Schema, 这将导致每个数据库只会有一张&__MigrationsHistory&表,从而无法辨别实体与模型的对应关系。
  &从 EF6 开始,Configuration&类将会包含一个&ContextKey&属性,它将作为每一个 Code First Model 的唯一标识符,&__MigrationsHistory&表中一个相应地的列允许来自多个模型(multiple models)的实体共享表(entries),默认情况下这个属性被设置成 context 的完全限定名。
生成、运行迁移
  Code First Migrations 有两个你需要熟悉的命令:
&Add-Migration 将&scaffold&创建下一次基于上一次迁移以来的更改的迁移;
Update-Databse 将任何挂起的迁移应用到数据库
  我们需要脚手架(scaffold&直译)一个迁移,以上面的 Url 属性为例,命令&Add-Migration 允许我们对迁移命名,我们姑且称之为&AddBlogUrl
在 Package Manager Console 中运行命令&Add-Migration AddBlogUrl;
一个新的迁移(名称包含 timestamp 前缀)在目录&Migrations&中创建成功
namespace MigrationsDemo.Migrations
using System.Data.Entity.M
public partial class AddBlogUrl : DbMigration
public override void Up()
AddColumn("dbo.Blogs", "Url", c =& c.String());
public override void Down()
DropColumn("dbo.Blogs", "Url");
  我们现在可以对这个迁移进行编辑或者增加,但似乎看起来还不错,那我们就直接用&Update-Database 来应用到数据库吧
在&Package Manager Console&中运行命令&Update-Database&;
AddBlogUrl&迁移将会被应用到数据库(表 Blogs 增加一列 Url)
定制化迁移
  到目前为止我们生成并运行了一个迁移,但是没有对迁移做任何更改,下面我们将尝试做一些更改:在类 Bolg 上增加一属性 Rating
public int Rating { get; set; }
  新建 Post
public class Post
public int PostId { get; set; }
[MaxLength(200)]
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
  在 Blog 中添加&Post&的集合
public virtual ICollection&Post& Posts { get; set; }
  在 Package Manager Console 中运行命令&Add-Migration AddPostClass
  生成的迁移如下
namespace MigrationsDemo.Migrations
using System.Data.Entity.M
public partial class AddPostClass : DbMigration
public override void Up()
CreateTable(
"dbo.Posts",
PostId = c.Int(nullable: false, identity: true),
Title = c.String(maxLength: 200),
Content = c.String(),
BlogId = c.Int(nullable: false),
.PrimaryKey(t =& t.PostId)
.ForeignKey("dbo.Blogs", t =& t.BlogId, cascadeDelete: true)
.Index(t =& t.BlogId);
AddColumn("dbo.Blogs", "Rating", c =& c.Int(nullable: false));
public override void Down()
DropForeignKey("dbo.Posts", "BlogId", "dbo.Blogs");
DropIndex("dbo.Posts", new[] { "BlogId" });
DropColumn("dbo.Blogs", "Rating");
DropTable("dbo.Posts");
  接下来我们对迁移做些更改:
在&Posts.Title 列上增加唯一索引;
使&Blogs.Rating 列非空,对于表中已经存在的数据,新列都会被赋值成&CLR&的默认数据类型(如 Rating 是整型,故默认值为0),但是我们想指定默认值为3,这样存在的记录将会有一个合理的评分。
  更改后的代码如下
namespace MigrationsDemo.Migrations
using System.Data.Entity.M
public partial class AddPostClass : DbMigration
public override void Up()
CreateTable(
"dbo.Posts",
PostId = c.Int(nullable: false, identity: true),
Title = c.String(maxLength: 200),
Content = c.String(),
BlogId = c.Int(nullable: false),
.PrimaryKey(t =& t.PostId)
.ForeignKey("dbo.Blogs", t =& t.BlogId, cascadeDelete: true)
.Index(t =& t.BlogId)
.Index(p =& p.Title, unique: true);
AddColumn("dbo.Blogs", "Rating", c =& c.Int(nullable: false, defaultValue: 3));
public override void Down()
DropIndex("dbo.Posts", new[] { "Title" });
DropForeignKey("dbo.Posts", "BlogId", "dbo.Blogs");
DropIndex("dbo.Posts", new[] { "BlogId" });
DropColumn("dbo.Blogs", "Rating");
DropTable("dbo.Posts");
  在 Package Manager Console 中运行命令&Update-Database &Verbose
数据移动 / 定制SQL&
  迄今为止,迁移都没有更改或移动数据,现在让我们看一下需要移动数据的例子。虽然没有对数据移动的原生支持,但是我们可以随意运行 SQL 脚本。
  让我们在 Post 中增加一个属性 Abstract, 稍后我们使用列 Content 的开头来填充此列(数据库已有记录)&
public string Abstract { get; set; }
在&Package Manager Console&中运行命令&Add-Migration AddPostAbstract&;
生成的迁移非常好,但是我们想使用 Content 的前 100 个字符来预填充 Abstract 列,我们可对迁移做如下更改
namespace MigrationsDemo.Migrations
using System.Data.Entity.M
public partial class AddPostAbstract : DbMigration
public override void Up()
AddColumn("dbo.Posts", "Abstract", c =& c.String());
Sql("UPDATE dbo.Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
public override void Down()
DropColumn("dbo.Posts", "Abstract");
  在&Package Manager Console&中运行命令&Update-Database &Verbose
迁移至指定版本(包括后退)
  迄今为止,我们总是升级至最新迁移,然而某些时候我们需要升级/降级至指定版本,例如我们想迁移数据库至运行&AddBlogUrl&迁移之后的状态,此时我们就可以使用&&TargetMigration 来降级到这个版本
  在 Package Manager Console 中运行命令&Update-Database &TargetMigration: AddBlogUrl&
  这个命令将会运行&AddBlogAbstract&and&AddPostClass 的 Down 命令
  如果你想回滚一切至空数据库,可以使用命令&Update-Database &TargetMigration: $InitialDatabase
得到SQL脚本
  如果其它开发人员也希望在他们自己的机器上拥有这些更改,他们只需在我们 check in 代码至 source control 的时候做一次同步即可,一旦他们拥有了这些迁移,只需运行命令&Update-Database 就可以把这些更改应用于本地。但是如果我们想把这些更改推送至测试服务器或生产服务器,我们也许需要一份 SQL 脚本提供给 DBA
在运行 Update-Database 的时候指定 -Specify 标记,我们就能够使得这些更改被写入一个脚本中而不是被应用,我们同时也会为此脚本指定源迁移和目标迁移,例如我们希望产生的脚本是从一个空数据库($InitialDatabase)到最新的版本(AddPostAbstract&迁移);(注意:如果你没有指定目标迁移,那么迁移将始终更新至最新版本;如果你没有指定源迁移,那么迁移将以数据库目前状态为初始)
在&Package Manager Console 中运行命令&Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration: AddPostAbstract
  产生的 SQL 脚本如下
DECLARE @CurrentMigration [nvarchar](max)
IF object_id('[dbo].[__MigrationHistory]') IS NOT NULL
SELECT @CurrentMigration =
(SELECT TOP (1)
[Project1].[MigrationId] AS [MigrationId]
FROM ( SELECT
[Extent1].[MigrationId] AS [MigrationId]
FROM [dbo].[__MigrationHistory] AS [Extent1]
WHERE [Extent1].[ContextKey] = N'MigrationsDemo.BlogContext'
AS [Project1]
ORDER BY [Project1].[MigrationId] DESC)
IF @CurrentMigration IS NULL
SET @CurrentMigration = '0'
IF @CurrentMigration & '431_InitialCreate'
CREATE TABLE [dbo].[Blogs] (
[BlogId] [int] NOT NULL IDENTITY,
[Name] [nvarchar](max),
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY ([BlogId])
CREATE TABLE [dbo].[__MigrationHistory] (
[MigrationId] [nvarchar](150) NOT NULL,
[ContextKey] [nvarchar](300) NOT NULL,
[Model] [varbinary](max) NOT NULL,
[ProductVersion] [nvarchar](32) NOT NULL,
CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey])
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'431_InitialCreate', N'MigrationsDemo.BlogContext',
0x1F8BFDBFB0F6D41EC826E1D11B4018B86FEC4958751FAE778D92DFD67FD8E4D1E200EBD44F178E69B996FE7B1FEFBFB8F7FB692C27B86C470AD0F54A823AE962392DAC5D1177276FAFF758EA1D3B3DBEAC8D4F7A7BAEFBFDAFB13CCFBF4B95E512BB3AC484DBC73C08F29A56DF6F6E4C418C0226EED731A0DEB5FAA169FA1BBE5E221576EDC2CBD21C910BAF90EEB0D018A6E131DD84D23E2D14D5BDA36AE4C5B762EB3C24DE752A049B0BADCD12DBA3FF75B7AC323C24A23DE8CAD7E805ADA273C60B622DE155FE14C7CB0CFC94322DED9874FEB93EA9E1F96BEA64B0B2ADB3CCF503B00D4D43BC1A3C2FE65EF9AAFB84E68D523614DDD251FE8CCB042ED8F82D797B4CCEC2ADACAEB2DBAC648AF67EE38C691ECA81DC06CE9A9ABE4B6DF73FB7D89C31BD6E433699BBC75431BCD4C22D5D38D7EF42C97BABC81AA7099009BAF63E6DE5DFECDA5F671EDAAF4B64AE5BDAAF8ED5F289DB2CBCF3C4CF29FE65B2BCC98E20B30F65EFF049C83C3FE60D8DA4B6FD811D49848FCCF8B823B0AF6AE82CE1E397C37ACF924D9EAFFDD81B57FD26F1DF479D58D4834C74BCD7D1E60B11ADEB803BA1DE0D3E6C5CB9F80E1CB1AC25DC314846EEED5A0A5CE542DCAC2C8BF2050B2DBE0EC1A2CAA59CD537B6E0CC8B9D8B83EF874B7FF6CD16DC6ECDFC4D9E47E8FC08DBA48B988AAB8AFBAA5BC0DC2D548D11FEB9AE90AEB53A10A8A06FDF605EC19B6C7B69FC34DC6FC0967B8FEABF71D40DD87C0E93F1D45E2A93A0C0000 , N'6.0.2-21211')
IF @CurrentMigration & '077_AddBlogUrl'
ALTER TABLE [dbo].[Blogs] ADD [Url] [nvarchar](max)
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'077_AddBlogUrl', N'MigrationsDemo.BlogContext',
0x1F8BFDBFB0F6D41EC826E1D11B4018B86FEC4958751FAE778D92DFD67FD8E4D1E200EBD44F178E69B996FE7B1FEFBFB8F7FB692C27B86C470AD0F54A823AE962392DAC5D1177276FAFF758EA1D3B3DBEAC8D4F7A7BAEFBFDAFB13CCFBF4B95E512BB3AC484DBC73C08F29A56DF6F6E4C418C0226EED731A0DEB5FAA169FA1BBE5E221576EDC2CBD21C910BAF90EEB0D018A6E131DD84D23E2D14D5BDA36AE4C5B762EB3C24DE752A049B0BADCD12DBA3FF75B7AC323C24A23DE8CAD7E805ADA273C60B622DE155FE14C7CB0CFC94322DED9874FEB93EA9E1F96BEA64B0B2ADB3CCF503B00D4D43BC1A3C2FE65EF9AAFB84E68D523614DDD251FE8CCB042ED8F82D797B4CCEC2ADACAEB2DBAC648AF67EE38C691ECA81DC06CE9A9ABE4B6DF73FB7D89C31BD6E433699BBC75431BCD4C22D5D38D7EF42C97BABC81AA7099009BAF63E6DE5DFECDA5F671EDAAF4B64AE5BDAAF8ED5F289DB2CBCF3C4CF29FE65B2BCC98E20B30F65EFF049C83C3FE60D8DA4B6FD811D49848FCCF8B823B0AF6AE82CE1E397C37ACF924D9EAFFDD81B57FD26F1DF479D58D4834C74BCD7D1E60B11ADEB803BA1DE0D3E6C5CB9F80E1CB1AC25DC314846EEED5A0A5CE542DCAC2C8BF2050B2DBE0EC1A2CAA59CD537B6E0CC8B9D8B83EF874B7FF6CD16DC6ECDFC4D9E47E8FC08DBA48B988AAB8AFBAA5BC0DC2D548D11FEB9AE90AEB53A10A8A06FDF605EC19B6C7B69FC34DC6FC0967B8FEABF71D40DD87C0E93F1D45E2A93A0C0000 , N'6.0.2-21211')
IF @CurrentMigration & '099_AddPostClass'
CREATE TABLE [dbo].[Posts] (
[PostId] [int] NOT NULL IDENTITY,
[Title] [nvarchar](200),
[Content] [nvarchar](max),
[BlogId] [int] NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY ([PostId])
CREATE INDEX [IX_BlogId] ON [dbo].[Posts]([BlogId])
CREATE UNIQUE INDEX [IX_Title] ON [dbo].[Posts]([Title])
ALTER TABLE [dbo].[Blogs] ADD [Rating] [int] NOT NULL DEFAULT 3
ALTER TABLE [dbo].[Posts] ADD CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'099_AddPostClass', N'MigrationsDemo.BlogContext',
0x1F8BEE3B083AB505D64AB1B2DA5D0F7DA4BEAB6ECAC17DD4B6DF0C67F4EF977FC61F354FAF13DEEFC5C2DDEFDEA7FFCF0E30FE3ABBB9F75A0E35B99CF82F4AA5E81CB358AAE37BECFB9AE754F3313059ADE34E58A07AB6FE8C2E33A2D00ABD0BBF81EE15CA862F7FC618A0B843DAC2ADBCF37E243DDBC583C2E80AB5D6E6156E4EFC4F4C2C4DAD055CBACB440A995ADFC3C2D0BB897D2F68EB06B672A36AED57EFCF7CEF283DFE7E9BFFDF9B91D59FC097EA052F98AC7CEF9AAE20AE572A0B1ECA72D875C863C68E7EC63DF9CB288ABE770FACA4F70B4D4B5A8FF4CE53C10AEF3A13C9BDF8F440BBA1C8B3CC08B01A6ABDD2B1A3E50C5B6F110F3F52BB8ECECB25D9F6AA4A11D1EF1D75F18AC75EAF0D65C06BAB31EC2E34BAC09ADCDA8095DEB7C14E7D3B2FE6FCEA2F27DBD038C41DC5EC9A15CBC2FA4CB614FDBCBD7D717FDBB90DBC15A45DDCB2A6BCB255DE10B5CAAA43BCA251F2D65CFC6BE938C761CB7EF730DDB32C150AF626313BAEDB1E9F382B2D1AB1BC2A0A7231CCF489AAC50BCBF670FA2EDCBF254B4A8C36D9D6AE2EF5315CD34CAA4BA2C833D1F0EEDEFA826552DADFF2F35DA3DF2A88B229BC85DAE23DB5AEDC248D6FBE3DCFFB51CADED0CD9FAF9B3A13A25EA7A239F7E494FFF6A50FA4DBDC0DA244B75A5F28EB8ECE0CDA5EAD34C906A9928CDE2709CFD487EDF8AAA553CC7B95AD14F13D0CCF2B8D72D202A3F06FDAA07F1F9E59A3FBCCFECFB334D521D839A6ECEAD2B78CCFFCE4AC8EAF94D38ED31B8F079AB4BDFCB0D9D75D4DDB173BF0BB066CC375D6607810FBACCCFFD96A356BBD13DEBE9C78E369F7D1F3399DB3EEF9ECC7A07B3FB3C05B2DD9DB3DAE74CD6CBD235B176CECEF479D3A3EF1AE09C99EF38339BDB4E20478C0FFDC84D49971B08FDD99F43D7A226A5AEEB81DF499B01C45AEC5769AEDEB3BA126FBB6F38BC1B46DFD77001CDA4E802CCF9A79CB2B8B1FBBAA3EEF640E82CAADE2B7D974ABF5BCB0A02A7C4DF23F1ED770CDB111B5FB8C8D3EFE44FAC5C9EAC37FEC5F0 , N'6.0.2-21211')
IF @CurrentMigration & '575_AddPostAbstract'
ALTER TABLE [dbo].[Posts] ADD [Abstract] [nvarchar](max)
UPDATE dbo.Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'575_AddPostAbstract', N'MigrationsDemo.BlogContext',
0x1F8BEE3B083AB505D64AB1B2DA5D0F7DA4BED9B2B35E742F414CCE7C9C197E339CB1FFFDF2CFF8E320A3E71CF21E5AB899BAAE5BB5FDD8F1F7EFC617C1D461BE77329F75ECBAAD547CEE428AAAC2BB383BFBCD3B3FF29CF163CA158D20FB801FB0BD77FC0CD5B071EC82BCE93ADDCBFFB48D01ECBFACC587BA7176A1DDF06AC5A3C2E80AB5D5E6656E4EDC4F4CAC9AB0BB8FD741DAFADEB99CA95AAA1A74D98B8B75CBDBF709DBBAC115A5FC108DE9CA7FF96A7EE367F025FAB8CE0DDDC738ACB0EF90E7849DFC8C470C3E38EBCDED1584EEF358D735A8FF4CE4BC60AEF3983BBEECD584DBDB5DE30D9FA862BBD27E7ED31F34AC5A0C257DCEEAC3395F32DBE67C990D343BBA41CCCD43A7DD518FAEB1A5DB9F76DB073D74CC07B7E050CFCEFC18D09EB33D655F0E6CE15C4CFD6DE756FECF9DEEAAC046CCC5A9ACBFBA01ABAD5CBC1DB9EB7C6BE958C661C77EF750DBB32A1A15EC4C6CAF6EA36E28BDBCA32C3B4FAFA7F51CCF491C6C58AE3E77DE8EC9D7F78EF17EAC0CADAEA247CE0C80A8C5DFDAAE88220BA2EBED2C8C2CB101DC2B4F6A52D0BEAFE3FDE8AD491BBD9C36D5CAFADA4EC779EF7A3E44DEC61B87ED93DECA754F56F96F5FFA204AE489FB064AD85DE4204A74ABF585B26C1D9BA1EC6E13AB57B4D946A71384EDDCE3581EAD5EA43ABD2ACFFFD704568DCC455C07C3F34A435D1FFDAD5C8FF9BCD18CD2EA0D593F80BB81E07CE2F8C6F1B8E98FC3DEFFA90EC1DEC96A5FBFBF63E2E7AF229B9F9B494FEE99CF3B5DFA4E86EB4E2EA36E4FCA875D803116BFE932CDD1F74D601DDDF3F6FB5B4E80EDFEFBB2A74D3CD9D8F87D8C8AEC9D17F3D76EEAB3B77B8AEA1A257B27C92ED8CED9EEE77A74DE418E347EE8406E4ABAAA21F4CF1E1CBBEB4A11A372CD4D145DA4CCDEB9CF84AD20BCE5F7A98AADEFFCDCB6D9BC7F771D6ED7F0D17D04C8A2EC03DFFDF74D4DD1E089D45C5E3A7EF52EEE041FAFEF29EFBE415FA6DDB1FC376C4CC902A3D6C78F48BF30DA7CF80FF7E621BAAA1B0000 , N'6.0.2-21211')
产生幂等脚本(EF6+)
  从 EF6 开始,如果你使用&&SourceMigration $InitialDatabase,&产生的脚本将是幂等的,幂等脚本意味着无论数据库当前处于什么版本/状态,都能升级至最新版本或指定版本(指定&&TargetMigration),生成的脚本包括检查表&__MigrationsHistory&的逻辑以及只更新之前从未更新的
在应用程序启动时自动升级(MigrateDatabaseToLatestVersion初始化器)
  当你发布部署应用程序的时候,可能希望当程序启动的时候它自动更新数据库(更新应用任何未更新的迁移),你可以通过注册&MigrateDatabaseToLatestVersion 数据库初始化器来实现这一点,数据库初始化器只包含一些逻辑检查用于确保数据库被正确设置,这个逻辑检查将会在AppDomain 的 context 第一次被使用的时候执行。
  当我们创建一个初始化器的实例时,需要指定 context type(BlogContext)以及&migrations configuration&(Configuration)- 这个迁移配置类是在我们启用迁移时生成的&Migrations&目录下增加的
using System.Collections.G
using System.Data.E
using System.L
using System.T
using System.Threading.T
using MigrationsDemo.M
namespace MigrationsDemo
class Program
static void Main(string[] args)
Database.SetInitializer(new MigrateDatabaseToLatestVersion&BlogContext, Configuration&());
using (var db = new BlogContext())
db.Blogs.Add(new Blog { Name = "Another Blog " });
db.SaveChanges();
foreach (var blog in db.Blogs)
Console.WriteLine(blog.Name);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
阅读(...) 评论()Access denied | jquery.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (jquery.com) has banned your access based on your browser's signature (441cf3a-ua98).25K868 条评论分享收藏感谢收起赞同 65577 条评论分享收藏感谢收起

我要回帖

更多关于 降一个key多少度 的文章

 

随机推荐