【问题标题】:EF CTP5 error: Invalid object nameEF CTP5 错误:对象名称无效
【发布时间】:2011-08-26 00:12:28
【问题描述】:

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

【问题讨论】:

  • 在 Visual Studio 中创建该 mdf 的连接,并查看是否有 Products 表。

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


【解决方案1】:

如果你的表名是数据库中的 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;

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

【讨论】:

  • 谢谢奥马尔。表属性解决了我的问题。我只能添加它而不是 SchemaName = "dbo",我必须添加 Schema="dbo"(SchemaName 无法识别)。
  • 谢谢奥马尔!我只需要使用 Schema 而不是 Schemaname。你拯救了我的夜晚!
【解决方案2】:

我遇到了同样的问题,但我做了 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>());

【讨论】:

  • 如果您处理代码优先的方法,这很好,但如果您尝试映射到现有数据库,这将不起作用。
【解决方案3】:

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

【讨论】:

  • 我都试过了。通常我可以在上下文中将其命名为复数,在数据库中将其命名为单数。但现在两者都是复数,没有运气。
  • 尝试跟踪 SQL。该错误是从数据库服务器返回的,这表明您可能连接到错误的数据库。你的连接字符串是什么?您连接的用户是否配置了正确的默认数据库?
  • 我的连接字符串在上面。我直接从 vs studio 使用 sqlexpress
【解决方案4】:

似乎 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);
 }

【讨论】:

  • 这对于我所描述的确切场景来说是完美的。谢谢!
  • 注意:DbModelBuilder 应该是 ModelBuilder
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多