实体框架代码首先不使用 VS 2012 创建表

Posted

技术标签:

【中文标题】实体框架代码首先不使用 VS 2012 创建表【英文标题】:entity framework code first not creating tables using VS 2012 【发布时间】:2014-02-20 16:46:01 【问题描述】:

我在 Visual Studio 2012 下有一个 MVC4 Web api 项目,我想首先使用 EF 6.0.2 代码创建和管理数据库。实际上,解决方案需要四个项目,即,

OnlineShop.Application(用户界面) OnlineShop.Model 仅专用于 POCO 类 OnlineShop.Test 用于单元测试和 OnlineShop.Core 具有 UnitOfWork、GenericRepository 和 DatabaseContext 类

每个提到的项目都包含一个 app.config,它与 web.config 保持相同的连接。

问题: 运行项目后(在调试模式下),创建的数据库与服务器资源管理器中显示的一样(在 Visual Studio 2012 中)。但是,它没有桌子!!!

数据库上下文类也如下:

 public class DatabaseContext : DbContext

    public DatabaseContext() : base("OnlineShopDb")
    
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseContext, Configuration>());
    

    //public static void InitializeDatabase()
    //
    //    using (var context = new DatabaseContext())
    //    
    //        context.Database.CreateIfNotExists();
    //        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseContext, Configuration>());
    //    
    //

    public DbSet<Person> Persons  get; set; 
    public DbSet<Customer> Customers  get; set; 
    public DbSet<User> Users  get; set; 
    public DbSet<Audit> Audits  get; set; 
    public DbSet<RoleGroup> RoleGroups  get; set; 
    public DbSet<Role> Roles  get; set; 
    public DbSet<UserInRole> UserInRoles  get; set; 
    public DbSet<Order> Orders  get; set; 
    public DbSet<OrderDetail> OrderDetails  get; set; 
    public DbSet<Product> Products  get; set; 
    public DbSet<ProductCategory> ProductCategories  get; set; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Entity<Person>().Map<User>(c => c.Requires("Discriminator").HasValue("User"));
    

我在网上冲浪了很多,找到了很多关于 EF 代码优先方法的文章和示例,但不幸的是无法处理这个糟糕的问题!

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

你试过用 c# 代码访问你的数据库吗?像 db.products.tolist()?,entityframework 构建数据库,直到您尝试获取或设置一些数据 好吧..现在不只是尝试它可能会有所帮助.. 作为记录,我发布了我的答案 不,很遗憾它没有做任何改变 对我来说似乎很好,也许尝试删除你的构造函数和覆盖,然后 EF 将使用它们的默认值,并检查它是如何工作的 【参考方案1】:

实体框架代码在您尝试访问它之前不会首先创建您的数据库,因此请运行您的项目并尝试获取或插入一些记录到您的数据库中。

另一个有用的提示是,如果您更改模型,EF 默认会抛出异常,您必须删除当前数据库,以便 EF 可以创建一个新数据库。

或者我建议您更改默认行为this way

【讨论】:

以上是关于实体框架代码首先不使用 VS 2012 创建表的主要内容,如果未能解决你的问题,请参考以下文章

如何让实体框架在不保存对象的情况下创建/更新数据库表

实体框架6在不需要时复数表名

实体框架代码优先的性能

实体框架代码首先尝试打开错误的数据库

DbContext 代码生成策略在实体框架 5 和 VS 2012 中失败

如何关闭实体框架 5 的复数表创建?