MVC 4实体框架没有从SQL服务器中提取数据库

本文关键字:服务器 SQL 提取 数据库 实体 框架 MVC | 更新日期: 2023-09-27 18:30:14

我运行的是SQL server express 2008 R2,带有数据库和SQL身份验证。我已经将数据库连接添加到服务器资源管理器,并将连接字符串添加到web.config文件。当我调试应用程序时,它似乎正在创建一个默认数据库,例如tutorial.MVC等,而不是在创建应用程序之前提取我创建的数据库。

此外,我得到了编译错误:{"Invalid object name 'dbo.Products'."},这应该发生,因为SQL是:

{SELECT 
[Extent1].[ProductID] AS [ProductID], 
[Extent1].[ProductName] AS [ProductName], 
[Extent1].[ProductPrice] AS [ProductPrice]
FROM [dbo].[Products] AS [Extent1]} 

不存在名为products的表。这一定是由实体框架数据库生成的。我已经删除了它,因为Products模型类最初是Products,因为数据库表被称为Product(人为错误),所以它无法更新SQL。本质上,我只是希望控制器映射到正确的数据库。我怀疑它没有从connectionString中提取数据库。尽管StoreContext在调试时会拾取连接字符串。似乎没有提取数据库。但可以看出原因Web.config

<configuration>
  <connectionStrings>
    <add
      name="StoreContext"
      connectionString="Data Source=ADMIN-PC'SQLEXPRESS;Initial Catalog=test;Integrated Security=True;User ID=Login;Password=***********"
      providerName="System.Data.SqlClient"
  />
  </connectionStrings>

global.asax

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            Database.SetInitializer<Tutorial.Models.StoreContext>(null);
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }

产品控制器

 public class ProductController : Controller
    { 
        StoreContext hello = new StoreContext();
        //
        // GET: /Product/
        public ActionResult Index()
        {
            var product = hello.Product.ToList();
            return View(product);
        }
    }

产品型号:

{
    [Table("Product")]
    public class Product
    { 
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public double ProductPrice { get; set; }
    }
}

StoreContext:

public class StoreContext: DbContext
    {
        public DbSet<Product> Product { get; set; }
    }

MVC 4实体框架没有从SQL服务器中提取数据库

您是否在项目中设置了正确的DatabaseInitializer

IDatabaseInitializer包含4个可以使用的派生类型:CreateDatabaseIfNotExistsDropCreateDatabaseAlways将数据库迁移到最新版本

选择适合您需求的初始值设定项并从中派生。

接下来,在上下文的构造函数上,设置初始值设定项:

public Context() : base("ConnectionString")
{
    Database.SetInitializer(new MigrationsDatabaseInitializer());
}

MigrationsDatabaseInitializer是我从MigrateDatabaseToLatestVersion派生的类。

也许你的项目总是一遍又一遍地重新实例化数据库。

您可以使用约定禁用复数形式。覆盖OnModelCreation并删除复数约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    base.OnModelCreating(modelBuilder);
}

希望它能有所帮助!:)