代码优先:创建表但不创建数据库

本文关键字:创建 数据库 代码 | 更新日期: 2023-09-27 18:35:33

我已经在代码上准备好了我的模型 EF,我在sql express上尝试了它,它可以工作。但是我在将其转换为 sql 服务器时遇到问题:我没有重新创建数据库的权限,我只能将表添加到空数据库中

我已经看到了这个答案,但是当我尝试复制它时,我在上下文部分遇到了一些麻烦:

public class DropCreateDatabaseTables : IDatabaseInitializer<Context> {
#region IDatabaseInitializer<Context> Members

public void InitializeDatabase(Context context)

我已经引用了System.Data.Entity,但这不起作用,并且Context类不是System.Runtime.Remoting.Contexts上引用的

代码有问题?还是使用 EF 的最后工具提供更好的解决方案?

编辑:

最后是:

数据库上下文:

public class PeopleContext: DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Adress> Adresses{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Add Entity type configuration classes
        modelBuilder.Configurations.Add(new PersonConfiguration());
        modelBuilder.Configurations.Add(new AdressConfiguration());
    }
}

初始 化:

  public class DropCreateDatabaseTables : IDatabaseInitializer<PeopleContext>
{
    public void InitializeDatabase(PeopleContextContext)
    {
      bool dbExists;
      using (new TransactionScope(TransactionScopeOption.Suppress))
      {
        dbExists = Context.Database.Exists();
      }
      if (dbExists)
      {       
        // remove all tables
          Context.Database.ExecuteSqlCommand("EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'");
          Context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = '"DROP TABLE ?'"");

        // create all tables
        var dbCreationScript = ((IObjectContextAdapter)Context).ObjectContext.CreateDatabaseScript();
        Context.Database.ExecuteSqlCommand(dbCreationScript);

        Context.SaveChanges();
      }
      else
      {
          throw new ApplicationException("No database instance");
      }
    }
}

叫:

class Program
{
    static void Main(string[] args)
    {
        var person= new Person
        {
            Identifier= "John Doe"
        };
        Database.SetInitializer(new DropCreateDatabaseTables());
        using (var context = new PeopleContext())
        {
            context.People.Add(person);
            context.SaveChanges();

        }
    }
}

谢谢卢卡斯·卡布尔特!

代码优先:创建表但不创建数据库

示例中的Context类应该是您的DbContext类,即您指定DbSet<>的类。

例:

数据库上下文类

public class DataContext : DbContext {
    public DbSet<Customer> Customers { get; set; }
}

数据库初始值设定项

public class DropCreateDatabaseTables : IDatabaseInitializer<DataContext> {
    ...
}