我一直在玩新的MVC 5,我有一些模型,控制器和视图设置使用代码优先迁移.
我的问题是如何为用户和角色提供种子?我目前在Configuration.cs中的Seed方法中播放一些参考数据.但是在我看来,在第一次点击AccountController之前,不会创建用户和角色表.
我目前有两个连接字符串,所以我可以将我的数据从我的身份验证分成不同的数据库.
如何让用户,角色等表格与我的其他人一起填充?而不是当帐户控制器被击中?
我正在添加新的迁移,但此消息显示:
无法生成显式迁移,因为以下显式迁移正在等待处理:[201203170856167_left].在尝试生成新的显式迁移之前应用挂起的显式迁移.
谁能帮我?
我已使用该Add-Migration命令创建了迁移,但我想更改该迁移的名称.如何撤消迁移命令,以便我可以使用新的所需名称重新生成它?
是否只是删除生成的文件,或者这可能是一个坏主意?
我在VS 2012中使用EF Code First和EF 5.我使用PM update-database命令,我有一个简单的种子方法来填充一些带有样本数据的表.
我想删除并重新创建我的x.mdb.更新历史记录似乎不同步.如果我在我的上下文中注释掉我的所有DBS,update-database运行时没有错误,但在DB中留下了一些表.由于我在数据库中没有有价值的数据,因此最简单的方法是重置所有内容.
我怎么能做到这一点?
我试图忽略使用Entity Framework 6.0 rc1的"自动"迁移.我的问题是我现在不想要这个功能,每次运行我的应用程序时,我都可以看到所有实体日志都试图创建所有表.
期待感谢.
我使用迁移(EF 5.0)和代码优先有一个有趣的效果:
我用GUID主键创建了一些模型.(顺便说一句:对我来说,SQL Server使用它很重要NEWSEQUENTIALID(),这似乎是当前版本中的默认值)
在某些时候,我激活了迁移.我在初始迁移中添加了一些代码,这主要是.Index()根据需要.
当我删除数据库并调用update-database时,出现以下错误:
无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移.将挂起的模型更改写入基于代码的迁移或启用自动迁移.将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移.您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移.
我尝试过AutomaticMigrationsEnabled = true,无需更改或添加任何内容即可使用!
但既然我不想要AutomaticMigrationsEnabled,我也尝试再次删除数据库,update-database然后调用add-migration.我最终得到了一个似乎没有改变任何东西的额外迁移(见下文).我也尝试将这些行添加到初始迁移的底部 - 但这并没有改变任何东西.
其中一个型号:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
初始迁移代码:
public partial class InitialCreate : DbMigration
{
public override void Up()
{ …Run Code Online (Sandbox Code Playgroud) 我有一个项目,我想update-database反对我,但我在一个单独的项目中有我的模型和上下文.
如果我运行,enable-migrations我会收到此错误:在程序集"MyProject"中找不到上下文类型.
这可能是因为我的Context在MyProject.MVC中.
如果我enable-migrations针对MyProject.MVC 运行,我必须添加一个app配置文件.我不想这样做,因为我想在许多项目中使用代码.
那么我可以enable-migrations针对MyProject 运行并以某种方式告诉它在MyProject.MVC中查找Context吗?
我只是考虑将EF迁移用于我们的项目,特别是在发布之间的生产中执行模式更改.
我已经看到提到有一个API可以在运行时使用DbMigration该类执行这些迁移,但我找不到任何具体的示例.
理想情况下,我希望DbMigration每个数据库更改一个文件,并在应用程序启动时自动应用这些更改从当前版本到最新版本.
根据这篇博客文章,大多数使用EF迁移的公司都不会使用EF迁移更新生产数据库的数据库模式.相反,博客文章的作者建议使用Schema更新脚本作为部署过程的一部分.
我已经使用Schema更新脚本几年了,当它们工作时,我计划将来使用EF迁移,原因如下:
我可以想到的一个原因是,如果数据库模式只是由DBA而不是开发人员改变,那么禁止使用EF来迁移生产数据库.但是,我既是DBA又是开发人员,所以这在我的案例中并不重要.
那么,使用EF更新生产数据库有哪些风险?
编辑:我想补充一点,正如solomon8718已经建议的那样,我总是将生产数据库的新副本提取到我的登台服务器,并在将它们应用到生产服务器之前测试要在登台服务器上应用的EF迁移.对于生产系统的任何架构更新,IMO都是必不可少的,无论我是否使用EF迁移.
我最近开始使用Entity Framework迁移,并注意到在运行Update-Database命令时数据库名称并没有为我提供.
我的连接字符串是:
<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
我第一次运行Update-Database时,我的数据库是用正确的名称TestDB创建的.但是,一旦我对我的某个实体进行了更改,除非我添加一个启动项目名称(我正在使用多项目解决方案),否则它将不再为我更新:
Update-Database -StartUpProjectName "TestDB.Data"
Run Code Online (Sandbox Code Playgroud)
然后,这将创建另一个新的数据库,迁移将始终继续使用.我不介意放入StartUpProjectName命令,但有没有办法覆盖它产生的数据库的默认名称?它始终将数据库创建为
TestDB.Data.DataContext
Run Code Online (Sandbox Code Playgroud)
有没有办法确保传递StartUpProject名称时创建的数据库只是名为TestDB,或者这是使用StartUpProjectName设置的限制?
作为一个注释,我认为我需要指定StartUpProjectName的原因是我有一个多层项目设置.迁移配置文件位于我的"数据"项目中,实体/模型位于我的"域"项目中,等等.我目前在Global.asax.cs文件中也没有任何初始化选项,就像我之前使用过的那样.代码首先是ef 4.2.所以在我的项目中,我只在Data项目中有一个DataContext,在该项目中也有一个迁移配置.
编辑:
自从我最初设置这个问题以来,我偶然发现了在多项目解决方案中命名数据库的"正确"方法.虽然下面的答案将起作用,但它确实意味着您在另一个区域中复制了您的web.config,这不是一个理想的解决方案.相反,您可以通过执行类似的操作将名称放入DbContext(DataContext只是我在项目中使用的名称):
public class DataContext : DbContext
{
public DataContext() : base("DatabaseNameHere")
{ }
public DbSet<Table1> Table1 { get; set; }
public DbSet<Table2> Table2 { get; set; }
public virtual void Commit()
{
base.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
丰富