Entity framework 如何首先将新表添加到现有数据库代码中

Entity framework 如何首先将新表添加到现有数据库代码中,entity-framework,ef-code-first,Entity Framework,Ef Code First,最初,我首先使用EF6代码创建一个新数据库和两个新表。代码是: public class TestingContext : DbContext, IDisposable { public DbSet<CallDataRecord> CallDataRecords { get; set; } public DbSet<Attempt> Attempts { get; set; } public TestingContext() :

最初,我首先使用EF6代码创建一个新数据库和两个新表。代码是:

 public class TestingContext : DbContext, IDisposable
{
    public DbSet<CallDataRecord> CallDataRecords { get; set; }
    public DbSet<Attempt> Attempts { get; set; }

    public TestingContext()
        : base("Testing")
    {
        Database.SetInitializer<TestingContext>(new MigrateDatabaseToLatestVersion<TestingContext, GenericIVR.Migrations.Configuration>());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Attempt>().HasRequired(t => t.CallDataRecord).WithMany(a => a.Attempts).HasForeignKey(t => t.FKTaskId);

        modelBuilder.Entity<Attempt>().Property(x => x.AttemptId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();

        modelBuilder.Entity<CallDataRecord>().Property(x => x.TaskId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
    }
}

您是否设置了迁移?如果是这样,那么只需迁移数据库(addmigration blah;updatedatabase),它将只添加新表

如果您没有启用迁移,那么您仍然可以使用上面的代码。它应该在迁移时添加表


我正在用手机输入,或者我会提供一个代码测试。

只需创建新表作为模型,并将其条目添加到DbContext类中

类似于

 public class TestingContext : DbContext, IDisposable
{
    public DbSet<CallDataRecord> CallDataRecords { get; set; }
    public DbSet<Attempt> Attempts { get; set; }

    public DbSet<MyNewModel> MyNewModels { get; set; }
public类TestingContext:DbContext,IDisposable
{
公共DbSet CallDataRecords{get;set;}
公共数据库集尝试{get;set;}
公共DbSet MyNewModels{get;set;}

然后
添加迁移
更新数据库

如果您已经设置了自动迁移,这应该非常简单

如果没有,则需要运行
启用迁移–启用自动迁移
也许先在这里做一些进一步的阅读:

对于希望使用EF代码使用新表更新数据库的用户(例如,我想添加一个UserAttachment表以与现有用户表并排),请首先执行以下操作:

启用自动迁移后,您应该确保

1.)创建您认为合适的新模型

2.)创建您的配置文件,大致如下:

 class UserAttachmentConfiguration : EntityTypeConfiguration<UserAttachment>
    {
        public UserAttachmentConfiguration()
            : base()
        {
            HasKey(p => p.UserId);
            ToTable("UserAttachment");    

            HasRequired(t => t.User)
                .WithOptional(t => t.UserAttachment);                
        }
    }
modelBuilder

modelBuilder.Configurations.Add(new UserAttachmentConfiguration());
4.)通过Visual Studio的
包管理器控制台运行
更新数据库
,确保从下拉列表中选择了正确的项目,这可能是一个名为
存储库
的项目

新表应该现在存在于数据库中

  • 首先从package manager控制台启用迁移

  • 创建类似类的配置

    namespace Demo.Data.Configurations
    {
        public class DemoConnectionConfiguration : EntityTypeConfiguration<DemoConnection>
        {
            public DemoConnectionConfiguration()
            {
                ToTable("DemoConnection");
                HasKey(a => a.Id);
            }
        }
    }
    
    namespace Demo.Data.Configurations
    {
    公共类DemoConnectionConfiguration:EntityTypeConfiguration
    {
    公共DemoConnectionConfiguration()
    {
    ToTable(“DemoConnection”);
    HasKey(a=>a.Id);
    }
    }
    }
    
  • 在Context.cs中添加Dbset和Model Builder,如

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new DemoConnectionConfiguration());
    
        base.OnModelCreating(modelBuilder);
    }
    
    
    public DbSet<DemoConnection> DemoConnection { get; set; }
    
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    modelBuilder.Configurations.Add(新的DemoConnectionConfiguration());
    基于模型创建(modelBuilder);
    }
    公共DbSet DemoConnection{get;set;}
    
  • 从包管理器控制台“更新数据库”

  • 注意:“请从默认项目下拉列表中选择正确的文件夹”


    恭喜!您的DemoConnection表现在在数据库中。

    我必须在代码中更改一个新的TestingContext吗?连接字符串如何?只要您仍然设置了自动迁移,它将只为您添加表。如果您更改现有数据库中的列类型,它可能会变得有点混乱,但如果您只是像上面的dbSet那样添加一个表,那么它只会发送命令,以获得与上下文模型相同的架构。我想您没有领会我的意思。请查看我更新的连接字符串。最初我创建了一个DB
    Initial Catalog=Testing',现在我想将这些表添加到现有的DB
    DevDB`。I th我必须更改连接字符串,可能还有代码。如果它对其他人有帮助,我会提到我的facepalm。请确保使用属性,而不是字段。它仅适用于
    {get;set;}
    Ahah!property vs.field让我明白了。谢谢@Thomas!您只需在Model文件夹中创建一个新类,然后添加一行
    public DbSet MyNewModels{get;set;}?因为我试过了,但它不起作用。它给了错误:这个项目“没能建立。你为什么要这样做?我试过,但是在启动StaseC类“启动”时调用方法“CuffuStReVice”时出错。在设计时,考虑使用IDBCutExtFrand来重写DbWork的初始化。如果你是新的。就我而言,如果您遵循Blazor教程,您可能想知道要添加到的类是这样的:
    public class ApplicationDbContext:ApiAuthorizationDbContext
    对于任何试图编辑本文以在更新数据库命令之前包含添加迁移步骤的人,请注意,我已经回答了这个问题ic迁移已启用,因此我不尝试手动构建此更改。向下滚动到“您的第一次自动迁移”我正在执行相同的操作,但第2点不想配置任何额外内容。但运行更新数据库时出现异常。它是。。。。。。。。System.Runtime.Serialization.SerializationException:未解析成员“Npgsql.NpgsqlException,Npgsql,Version=2.2.4.3,Culture=neutral,PublicKeyToken=5d8b90d52f46fda7”的类型。位于System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)……未解析成员“Npgsql.NpgsqlException,Npgsql,Version=2.2.4.3,Culture=neutral,PublicKeyToken=5d8b90d52f46fda7”的类型。“@vinmm似乎与Npgsql程序集存在某种问题。我尝试过这种方法,但在使用模型属性时,在配置文件中出现以下错误:”UserAttachment“没有“UserId”的定义,并且找不到可访问的扩展方法“UserId”,该扩展方法接受类型为“UserAttachment”的第一个参数(是否缺少使用指令或程序集引用的方法?)。我不知道如何解决这个问题。我通过在模型中创建一个类创建了我的表。该类创建起来很容易,但当我尝试使用上述方法添加种子数据时,它会显示错误。您的UserAttachment模型是否有公共用户ID?您好,您似乎有两个帐户(和)。如果需要,您可以按照以下步骤合并这两个帐户:
    namespace Demo.Data.Configurations
    {
        public class DemoConnectionConfiguration : EntityTypeConfiguration<DemoConnection>
        {
            public DemoConnectionConfiguration()
            {
                ToTable("DemoConnection");
                HasKey(a => a.Id);
            }
        }
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new DemoConnectionConfiguration());
    
        base.OnModelCreating(modelBuilder);
    }
    
    
    public DbSet<DemoConnection> DemoConnection { get; set; }