EF CTP5错误:对象名称无效

时间:2011-01-18 18:14:18

标签: asp.net-mvc-2 entity-framework-4 entity-framework-ctp5

我在scottgu的博客上关于EF代码第一个CTP5的例子,但是我得到了错误

  

System.Data.SqlClient.SqlException:   无效的对象名称'dbo.Products'。

这是我得到的代码。

<add name="CTP5Context"
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|EFCTP5.mdf;User Instance=true"
     providerName="System.Data.SqlClient" />


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

public class Product
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public int Amount { get; set; }
}



var context = new CTP5Context();
        var products = context.Products;            

        return View(products);

我有点无能为力我在博客中做了同样的事情,这不是我第一次使用EF(但是CTP5 tho),我忽略了什么?

5 个答案:

答案 0 :(得分:7)

如果您的表名是数据库中的Product,请尝试:

[Table("Product", SchemaName = "dbo")]
public class Product
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public int Amount { get; set; }
}

使用Table属性您需要添加以下using语句:

using System.ComponentModel.DataAnnotations;

希望这有帮助!它对我有用。

答案 1 :(得分:5)

我遇到了同样的问题,但我做了2次更改,这对我有用。我更改了连接字符串(添加了初始目录)

<add name="CTP5Context"
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\northwind.mdf;User Instance=true;initial catalog=Northwind"
     providerName="System.Data.SqlClient" />

在Global.asax中我在Application_Start()

中添加了以下行
Database.SetInitializer<Northwind>(new System.Data.Entity.DropCreateDatabaseAlways<Northwind>());

答案 2 :(得分:3)

该异常看起来像来自数据库。您确定您的表名是'产品'还是'产品'(单数而不是复数?)

答案 3 :(得分:3)

似乎EF Code First的工作方式不同,具体取决于您要连接的数据库类型。如果使用SQLCE,这是ScottGu用来展示EF Code First的,那么将使用非复数的名称创建所有表。但是,如果您使用SQL Server 2008(这是我测试过的),它期望表名称为复数。有几种解决方法,您可以在Omar显示时添加表名属性,或者您可以覆盖上下文的OnModelCreating事件。

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

答案 4 :(得分:1)

确保您的产品表是使用 dbo 架构创建的,很多时候架构不是 dbo ,例如因为它可以是您的用户名或服务器名称(如果您正在使用的帐户不在 db_owner 架构中)。使用Visual Studio中的服务器资源管理器打开数据库(因为它是SQLExpress)

要执行此操作,请右键单击表名并选择打开表定义,然后在表定义中右键单击并选择属性,然后在属性窗口中检查列出的内容在架构值中。如果它不是DBO,那么您应该能够将其更改为dbo并保存。