我在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),我忽略了什么?
答案 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并保存。