0

我已经查看了过去的问题,但我无法解决我的问题

我在将简单数据库连接到 MVC 项目时遇到问题。这很难做到,我使用的是 VS2010、SQL Server 2008(远程数据库)。我已经创建了一个数据库,并且我想首先将代码与实体框架一起使用。听起来很简单,因为我只是按照教程进行操作,但我使用的教程都没有奏效过。这些教程使用较旧的 MVC 和较旧的实体框架。我有 MVC4 和 EF 5

这是我正在使用的步骤

  1. 创建新的 MVC 项目并在引用中我看到实体框架

  2. 创建将对应于尚未在数据库中创建的表的类

  3. 将连接字符串添加到web.config

  4. 添加额外的行以global.asax避免错误实体 5 抛出(从其他人的问题中发现了这一点)

  5. 添加带有 db 和 dbcontext 的控制器

  6. 运行项目,您可能会猜到名为 video 的控制器出现问题

错误:

异常详细信息:System.Data.SqlClient.SqlException:对象名称“dbo.videos”无效。

我不知道,这个 MVC 似乎比 Web 表单更不稳定,因为我可以毫无问题地连接到 Web 表单中的同一个数据库。

 <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; }
}

数据库上下文:

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'.
    }
4

1 回答 1

1

你连接到数据库很好。实际的 DB 模型和 codefirst 模型不同步,因此出现错误。

您正在将 DbSet 添加到视频的 DBContext 中,但当前数据库中不存在这样的表。除非您的数据库初始化程序声明在模型不存在时创建模型,否则这正是我希望您得到的错误。

此外,我没有看到定义或提到将模型类映射回数据库表的映射类。

看看http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- mvc-应用程序。这最终会进入数据库初始化程序。另一种选择是简单地手动创建表。

所以,问题一,没有数据库初始化器(或预定义表)。问题二,表和 OnModelCreating 没有映射类,至少从您所展示的内容来看。您完全有可能没有使用流利的 api 来定义映射,而只是使用视频模型中的属性,但同样,您没有展示这一点,所以我将向您展示流利的方式。

编辑:

我已使用您的命名约定在本地创建的测试项目中更新了此代码。这 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();
    }

这将返回我添加到表格中的任何“视频”。

至于去哪里,如果你在一个项目中做所有事情并不重要。选择一个地点。这就是我的事情是如何发生的。

在此处输入图像描述

您必须记住,在首先使用代码来启动和运行时,需要付出额外的前期努力。但是,一旦您掌握了窍门,它就会成为处理数据库的一种非常好的方式。

于 2012-12-01T03:01:19.023 回答