我使用Entity Framework Code First开始了我的项目.当我准备好时,我将我的数据库和代码上传到我的主机提供商.一切正常.
我需要在我的一个类中添加一个新字段,我不想丢失数据库中的数据.因此,我尝试了一些关于使用Code First Migrations的博客文章.我做了以下事情:
当我访问该网站时,我收到以下错误消息:自创建数据库以来,支持'blahblah'上下文的模型已更改.考虑使用Code First Migrations来更新数据库.
我究竟做错了什么?
我正在开发一个项目,它将使用ASP.NET Web API作为数据服务,并使用Xamarin便携式应用程序作为客户端.
我正在尝试在Web应用程序中启用迁移,但是我收到以下错误:
Enable-Migrations -enableautomaticmigrations -ContextTypeName MyProject.Models.ApplicationDbContext -ProjectName MyProject -StartupProjectName MyProject.App -Verbose
Using StartUp project 'MyProject.App'.
Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly
'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable."
At C:\Users\weitz\.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:718 char:5
+ $domain.SetData('project', $project)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SerializationException
Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly
'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable."
At C:\Users\weitz\.nuget\packages\EntityFramework\6.1.3\tools\EntityFramework.psm1:719 char:5
+ $domain.SetData('contextProject', $contextProject) …Run Code Online (Sandbox Code Playgroud) c# entity-framework ef-migrations asp.net-web-api xamarin.forms
我一直在学习如何使用EF一个星期左右,我一直坚持创建/更新我的数据库的问题.如果不存在,我可以创建一个初始化器来创建数据库:
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new GumpDatabaseInitializer());
....
class GumpDatabaseInitializer : CreateDatabaseIfNotExists<GumpDatabase>
{
public GumpDatabaseInitializer()
{
}
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
// Other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
或者我可以创建配置来迁移数据库
static class Program
{
static void Main()
{
Database.SetInitializer<GumpDatabase>(new MigrateDatabaseToLatestVersion<GumpDatabase, Configuration>());
....
internal sealed class Configuration : DbMigrationsConfiguration<GumpDatabase>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
protected override void Seed(GumpDatabase context)
{
}
Run Code Online (Sandbox Code Playgroud)
每个都正常工作,但我还没有想出办法做到这两点.我可以通过更改SetInitializer调用在两个初始化程序之间切换,但是如果我想创建数据库,如果它不存在,并且如果它是我该怎么做的话还要迁移它?我需要创建自定义初始化程序吗?
谢谢
根据NSGaga答案编辑
class …Run Code Online (Sandbox Code Playgroud) 我正在测试EF 4.3(测试版)
我有一些新的类应该生成db表和列.
从一个旧项目我的架构中有一些旧表,我想通过EF访问.声明所有类.为了访问旧表,有一个映射的poco.
db迁移也尝试创建旧表.
如何设置此类/表不是迁移的一部分,而是ef模型的一部分?
xxx.OnModelCreating()
{
modelBuilder.Ignore<myOldTableClass>();
}
Run Code Online (Sandbox Code Playgroud)
从模型中删除整个类.最后我无法通过dbContext使用它进行访问.
我喜欢使用自动迁移.我尽量避免将旧的db表完全迁移到EF类.(是的,我知道有生成器)有120个表,旧的应用程序仍然使用它们.
一些仅与EF(新应用程序)一起使用的新表.有3个常用的表格.那些不应该创建,但通过ef访问.
我正在尝试编写一个易于理解的DBContext类,它采用自定义连接字符串,可以运行迁移,并且我允许使用包管理器生成迁移.
我好像在四处走动.
我已经能够使用对我来说非常糟糕的代码来使用它.我在关于连接字符串和迁移的这个问题的答案中记录了这一点.
Radek的答案看起来比我的好,但是我发现当我实现它然后尝试在Package Manager中创建一个迁移时,我得到了消息
目标上下文'DataLayer.Context'不可构造.添加默认构造函数或提供IDbContextFactory的实现.
DataLayer.Context我的上下文类在哪里.
我不想提供一个实现IDbContextFactory(并且Radek的答案似乎表明它不需要)
更新:
如果我包含一个没有参数的构造函数,我可以生成一个迁移.例如
public Context() : base("ConnectionStringName") { }
Run Code Online (Sandbox Code Playgroud)
对于我的上下文创建,我在app.config中传递连接字符串的名称
public Context(string connString) : base(connString)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}
Run Code Online (Sandbox Code Playgroud)
最后,我既可以生成迁移,也可以为用户选择的数据库运行迁移.
但是:当我删除数据库然后运行我的应用程序时,我遇到了问题.
我正在使用的初始化代码,来自上面的链接
public class CustomInitializer : IDatabaseInitializer<Context>
{
public void InitializeDatabase(Context context)
{
try
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
if (!context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase =
new DbConnectionInfo(context.Database.Connection.ConnectionString);
IEnumerable<string> migrations = migrator.GetPendingMigrations();
foreach …Run Code Online (Sandbox Code Playgroud) 是否可以设置使用Entity Framework 6创建的SQL数据库的恢复模型模式?我知道可以通过以下SQL语句设置它:
ALTER DATABASE [Database_Name] SET RECOVERY SIMPLE;
Run Code Online (Sandbox Code Playgroud)
这似乎很奇怪,这不能被设置为的配置的一部分DbContext-它创建数据库似乎无法控制对象如何它的创建.我期待找到如下内容:
public class MyContext : DbContext
{
public MyContext(string connectionString) : base(connectionString)
{
// This is where I would have expected to be able to set the recovery model type
Database.RecoveryModel = RecoveryModelType.Simple;
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是不可能的,因为EF(主要)数据库提供程序不可知和恢复模型是MSSQL特定的,但我希望我错了.