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

rla*_*iga 5 c# entity-framework ef-code-first

我已经准备好我的代码第一个EF的模型,我在sql express上尝试它,它的工作原理.但我有一个问题,它将其转换为SQL服务器: 我没有权限重新创建数据库我只能将表添加到空数据库.

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

public class DropCreateDatabaseTables : IDatabaseInitializer<Context> {

#region IDatabaseInitializer<Context> Members



public void InitializeDatabase(Context context)
Run Code Online (Sandbox Code Playgroud)

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

代码有问题吗?或者使用EF的最后一个工具是更好的解决方案?

编辑:

最后是:

的DbContext:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

初始化:

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

      }

    }
}
Run Code Online (Sandbox Code Playgroud)

呼叫:

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


        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢Lukas Kabrt!

Luk*_*brt 3

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

例子:

DbContext 类

public class DataContext : DbContext {
    public DbSet<Customer> Customers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

数据库初始化器

public class DropCreateDatabaseTables : IDatabaseInitializer<DataContext> {
    ...
}
Run Code Online (Sandbox Code Playgroud)