我知道这应该很简单,但我无法在网上找到关于这个主题的正确教程或解释。有很多关于使用代码优先方法向现有表添加新列的视频和帖子,但我找不到任何关于如何将整个新表添加到现有数据库的分步说明。 这很奇怪,我很确定我会找到很多例子。也许我的搜索条件很差。所以如果有人有任何好的链接或视频,请分享。
我要做的是将表Post添加到由MVC 5项目创建的现有默认数据库中。 我先创建了模型类,将其命名为Post,它有一个简单的定义:
public class Post
{
[Key]
public int PostId { get; set; }
public string PostText { get; set; }
public byte[] ImagePost { get; set; }
public byte[] FilePost { get; set; }
public string TextPost { get; set; }
public string UserId { get; set; }
}
然后我先怀疑。我知道我应该创建DbContext,但是如果我想要访问现有数据库,我应该使用现有的DbContext,默认情况下已经在Web.config文件中创建了这样的:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-StudentBookApp-20150114035149.mdf;Initial Catalog=aspnet-StudentBookApp-20150114035149;Integrated Security=True"
providerName="System.Data.SqlClient" />
或者我应该使用为Post类创建的所有新DbContext?
无论如何我都试过了,但没有成功。当我创建这个新的上下文时,我在PMC中进行了以下操作:
Enable-Migrations
Add-Migration "PostMigration"
Update-Database
通常,或者一切顺利,但我没有在数据库中获得任何新表,或者我收到错误:AspNetUsers已经存在,AspNetUsers是我通过添加新列更改的自动创建的表之一它。
更新:我现在的上下文是在名为PostContext的分隔类中,它看起来像这样:
public class PostContext : DbContext
{
public PostContext() : base("name=PostContext")
{
}
public DbSet<Post> Posts { get; set; }
}
第二次尝试:
由于我的第一种方法没有给出任何结果。我已经尝试过做link中描述的内容。添加映射到我的项目:
我创建了用于映射的新类PostConfiguration:
public class PostConfiguration : EntityTypeConfiguration<Post>
{
public PostConfiguration() : base()
{
HasKey(p => p.PostId);
ToTable("Post");
HasOptional(p => p.PostText);
ToTable("Post");
HasOptional(p => p.ImagePost);
ToTable("Post");
HasOptional(p => p.TextPost);
ToTable("Post");
HasOptional(p => p.FilePost);
ToTable("Post");
HasRequired(p => p.UserId);
ToTable("Post");
}
}
在Post类我已经添加了上下文类PostContext和modelBuilder变量,正如他们在上面列出的链接中所建议的那样:
public class PostContext : DbContext
{
static PostContext()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PostContext>());
}
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties()
.Where(p => p.Name == "Key")
.Configure(p => p.IsKey());
modelBuilder.Configurations.Add(new PostConfiguration());
}
}
我再次运行所有PMC命令,但仍未成功,默认数据库中缺少表Post。
答案 0 :(得分:17)
这里发生的事情是,在启用迁移之前,您已有现有的数据库表。 因此,实体框架认为需要创建所有数据库对象,这可以通过打开PostMigration迁移文件来看到。
最好的方法是在添加Post表之前将EF引入初始迁移,然后再执行Posts迁移。
在DBContext中注释帖子,以便EF不了解帖子
//public DbSet<Post> Posts { get; set; }
启用迁移
Enable-Migrations
在更改之前添加包含所有表的初始迁移
Add-Migration "InitialBaseline" –IgnoreChanges
现在更新数据库,这将创建一个MigrationHistory表,以便EF知道已经运行了哪些迁移。
Update-Database
现在,您可以将1中的行取消注释为&#34;进行更改&#34;
通过添加帖子
创建新的迁移Add-Migration "PostMigration"
现在进行更新......希望它一切正常。
Update-Database
现在,所有迁移都已设置好并且它们已成为基线,未来的迁移将很容易。
有关详细信息,我发现此链接很有用: http://msdn.microsoft.com/en-us/data/dn579398.aspx