【发布时间】:2015-03-13 13:44:12
【问题描述】:
我知道这应该很简单,但我无法在网上找到有关此主题的正确教程或解释。有很多关于使用代码优先方法向现有表添加新列的视频和帖子,但我找不到任何关于如何将整个新表添加到现有数据库中的分步说明。 这很奇怪,我很确定我会找到很多例子。也许我的搜索条件不好。所以如果有人有任何好的链接或视频,请分享。
我要做的是将表 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 类中,我也添加了带有 modelBuilder 变量的上下文类 PostContext,正如他们在上面列出的链接中所建议的那样:
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。
【问题讨论】:
-
您是否将您的课程添加到您的上下文中?我们可以查看您的上下文文件吗?
-
@vgSefa 当然,我刚刚更新了我的帖子并添加了 PostContext 类代码:)
-
这是 SQL Server,对吧? (我问是因为迁移不适用于 SQLite 的 ADO.NET 提供程序)。
-
@bvgheluwe 是的。我的意思是它是一个本地数据库,但据我所知,VS 2013 默认使用 SQL Server。 :) 当我向 AspNetUsers 表添加新列时,迁移确实有效,因此该数据库肯定支持它们......我错过了一些步骤,并且不知道它可能是什么...... :(
-
将您的 DefaultConnection 重命名为 PostContext
标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-migrations