【问题标题】:Code First: Create Tables but not database代码优先:创建表但不创建数据库
【发布时间】:2013-10-14 21:14:33
【问题描述】:

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

我已经看到 this answer ,但是当我尝试复制它时,上下文部分出现了一些问题:

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();


        }
    }
}

感谢 Lukas Kabrt!

【问题讨论】:

  • 不要从编写自己的初始化程序开始,而是使用标准初始化程序,例如 Database.SetInitializer(new DropCreateDatabaseAlways&lt;Context&gt;()); 参见 DropCreateDatabaseAlways
  • 因为我的凭据我无法删除数据库并重新创建它,我只能在现有的空数据库上创建表

标签: c# entity-framework ef-code-first


【解决方案1】:

示例中的Context 类应该是您的DbContext 类,即您指定DbSet&lt;&gt;s 的类。

例子:

DbContext 类

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

数据库初始化器

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

【讨论】:

  • 我尝试了你的解决方案,但我不知道它是怎么做的:我可以用代码编辑我的帖子,你告诉我是否正确吗?
  • 来吧,我可以试试看你的……虽然你在编译代码时遇到了问题,所以我还没有编写任何初始化程序的实现
  • 别担心,我用正确的代码编辑了问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多