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; }
}
您是否在项目中设置了正确的DatabaseInitializer?
IDatabaseInitializer包含4个可以使用的派生类型:CreateDatabaseIfNotExists、DropCreateDatabaseAlways和将数据库迁移到最新版本
选择适合您需求的初始值设定项并从中派生。
接下来,在上下文的构造函数上,设置初始值设定项:
public Context() : base("ConnectionString")
{
Database.SetInitializer(new MigrationsDatabaseInitializer());
}
MigrationsDatabaseInitializer是我从MigrateDatabaseToLatestVersion派生的类。
也许你的项目总是一遍又一遍地重新实例化数据库。
您可以使用约定禁用复数形式。覆盖OnModelCreation并删除复数约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
}
希望它能有所帮助!:)