我已经查看了过去的问题,但我无法解决我的问题
我在将简单数据库连接到MVC项目时遇到问题。这很难做到,我使用的是VS2010,SQL Server 2008(远程数据库)。我已经创建了一个数据库,我想首先使用实体框架代码。听起来很简单,因为我只是按照教程,但没有使用过的教程。教程使用较旧的MVC和较旧的Entity Framework。我有MVC4和EF 5
以下是我正在使用的步骤
创建新的MVC项目,在参考文献中我看到了Entity Framework
创建类,该类将对应于尚未在DB中创建的表
将连接字符串添加到web.config
向global.asax
添加额外的一行,以避免错误实体5被抛出(从其他人发现这个问题)
使用db和dbcontext添加控制器
运行项目,因为您可以猜测控制器名为video
错误:
异常详细信息:System.Data.SqlClient.SqlException:无效的对象 名字'dbo.videos'。
我不知道这个MVC似乎比Web表单更不稳定,因为我可以在没有问题的情况下连接到webforms中的相同数据库。
<add name="videoDBContext"
connectionString="Data Source=xxxxxxx;Initial Catalog=xx;Persist Security Info=True;User ID=xx; Password=xxx"
providerName="System.Data.SqlClient" />
类别:
public class video
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
的DbContext:
public class videoDBContext : DbContext
{
public DbSet<video> videos{ get; set; }
}
控制器操作
public ActionResult Index()
{
return View(db.videos.ToList()); //
Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.videos'.
}
答案 0 :(得分:1)
您正在连接数据库。实际的DB模型和codefirst模型不同步,因此出错。
您正在为视频的DBContext添加DbSet,但当前数据库中不存在此类表。除非您的数据库初始化程序声明在不存在时创建模型,否则这正是我期望您获得的错误。
另外,我没有看到定义或提到的映射类将模型类映射回数据库表。
看看http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application。这将最终进入数据库初始化程序。另一种选择是手动创建表。
所以,问题一,没有数据库初始化程序(或预定义的表)。问题二,没有表和OnModelCreating的映射类,至少从你所显示的那个。完全有可能你没有使用流畅的api来定义你的映射,而只是在视频模型中使用属性,但是你没有证明这一点,所以我将以流畅的方式向你展示。 / p>
编辑:
我已经使用您的命名约定从我在本地创建的测试项目中更新了此代码。这100%有效。这些是我创建或反向设计的确切类别。
public class videoDBContext : DbContext
{
static videoDBContext()
{
Database.SetInitializer<videoDBContext>(null);
}
public videoDBContext()
: base("Name=videoDBContext")
{
}
public DbSet<Video> Videos { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new VideoMap());
}
}
域类
public class Video
{
public int Id { get; set; }
public string Description { get; set; }
}
和映射类
public class VideoMap : EntityTypeConfiguration<Video>
{
public VideoMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Description)
.IsRequired()
.HasMaxLength(50);
// Table & Column Mappings
this.ToTable("Video");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Description).HasColumnName("Description");
}
}
然后我的控制器操作
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
using (videoDBContext context = new videoDBContext())
{
var list = context.Videos.ToList();
}
return View();
}
这会返回我添加到表格中的任何“视频”。
至于什么地方,如果你在一个项目中做所有事情并不重要。选一个地方。这就是我的事情如何震撼。
你必须记住,在首先使用代码来启动和运行代码时需要额外的前期工作。但是,一旦掌握了它,它就是一种非常好的数据库处理方式。