2012-12-01 39 views
0

我已经看了以前一些关于这个问题,但我有连接简单的数据库MVC项目问题我解决不了我的问题MVC4无法连接到SQL Server 2008中的远程数据库

。这是非常困难的,我正在使用VS2010,SQL Server 2008(远程数据库)。我有一个已经创建的数据库,我想先用Entity Framework使用代码。听起来很容易,因为我只是按照教程,但没有教程,我曾经工作过。这些教程使用较旧的MVC和较旧的实体框架。我有MVC4和EF 5

下面是我使用

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

  2. 创建类,这将对应一个表尚未在DB创建

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

  4. 添加额外的行global.asax避免出错的实体5抛出了

  5. 与DB添加控制器的DbContext

  6. 跑项目,你可以猜测的问题(从其他民族问题与此发现了这一点)与控制器称为视频出现

错误:

Exception Details: System.Data.SqlClient.SqlException: Invalid object name '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'. 
    } 
+1

这不是一个ASP.NET MVC问题,它是一个实体框架问题。假设这些是新表,在某些时候SQL表必须实际生成。我从来没有用EF代码第一,但我会猜你的问题,我读为“从代码第一模型添加表和现有数据库的关系”可能与Code First Migrations有关:http:// msdn。 microsoft.com/en-us/data/jj591621.aspx – JayC

回答

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来定义你的映射,而只是使用视频模型中的属性,但是再一次,你没有表现出来,所以我会告诉你流畅的方式。

编辑:

我已经更新了从我与您的命名约定本地创建一个测试项目验证码。这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(); 
    } 

这个回报什么 “视频” 我添加到表。

至于什么去哪里,如果你在一个项目中做所有事情并不重要。选一个点。以下是我的情况。

enter image description here

你要记住有一个与代码工作时,首先要得到的东西和运行额外的前期工作。然而,一旦你掌握了它,这是一个非常好的使用数据库的方式。

+0

我已经预先创建了一个视频表,所以我现在要做什么? – jagguy

+0

我以前没有看到任何教程中的任何映射类?这在类文件中进行?这对于简单的连接似乎非常复杂。 – jagguy

+0

我已经使用您的名字在本地创建的实际示例的确切类更新了我的回复。 – Khepri