4

我在 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),我忽略了什么?

4

5 回答 5

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;

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

于 2011-01-29T19:56:58.747 回答
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>());
于 2011-05-09T02:50:15.487 回答
3

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

于 2011-01-18T18:16:44.997 回答
3

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

 protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
 }
于 2011-08-25T16:12:28.130 回答
1

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

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

于 2011-01-23T01:13:45.933 回答