实体框架抛出异常 - 无效的对象名称'dbo.BaseCs'

Mar*_*gal 42 c# sql entity-framework asp.net-mvc-3

我在这里遵循了亚当的答案,现在实体框架正常工作,Seed()方法也有效.

但是当我尝试像这样访问数据库时:

    public User FindUserByID(int id)
    {
        return (from item in this.Users
                where item.ID == id
                select item).SingleOrDefault();
    }
  .............................................................................
    // GET: /Main/

    public ActionResult Index(int? id)
    {
        var db = UserDataBaseDB.Create();

        if (!id.HasValue)
            id = 0;

        return View(db.FindUserByID(id.Value));
    }
Run Code Online (Sandbox Code Playgroud)

它引用了一个例外return (from item in this.Users:

Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.BaseCs'.

我已经尝试用它替换它: return this.Users.ElementAt(id);但是它会抛出这个异常.

LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable1 [MySiteCreator.Models.User],Int32)'方法,并且此方法无法转换为商店表达式.

谁能帮我?
谢谢!

Jef*_*ata 66

异常详细信息:System.Data.SqlClient.SqlException:无效的对象名称'dbo.BaseCs'

此错误意味着EF正在将您的LINQ转换为使用命名的对象(很可能是表)的sql语句,该对象dbo.BaseCs在数据库中不存在.

检查数据库并验证该表是否存在,或者您应该使用其他表名.此外,如果您可以发布您正在关注的教程的链接,那么将有助于跟进您正在做的事情.

  • 完美,在连接字符串中使用了错误的目录/数据库。 (5认同)
  • 是的,它显然不存在 - 但首先使用代码,如果数据库表不存在,EF 应该创建它。 (2认同)

aca*_*lon 21

它很可能是'adrift'所提到的模型类名和表名之间的不匹配.如果要保持模型类名与表名(我为OAuthMembership所做的)不同,请使它们相同或使用下面的示例.请注意,模型类名称为OAuthMembership,而表名称为webpages_OAuthMembership.

为模型提供表属性:

[Table("webpages_OAuthMembership")]
public class OAuthMembership
Run Code Online (Sandbox Code Playgroud)

或者通过重写DBContext OnModelCreating来提供映射:

class webpages_OAuthMembershipEntities : DbContext
{
    protected override void OnModelCreating( DbModelBuilder modelBuilder )
    {
        var config = modelBuilder.Entity<OAuthMembership>();
        config.ToTable( "webpages_OAuthMembership" );            
    }
    public DbSet<OAuthMembership> OAuthMemberships { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)


sfs*_*sfs 12

如果您提供这样的映射:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ClassificationMap());
        modelBuilder.Configurations.Add(new CompanyMap());
        modelBuilder.Configurations.Add(new GroupMap());
        ....  
    }
Run Code Online (Sandbox Code Playgroud)

请记住为BaseC添加地图.

如果缺少编译错误,您将不会收到编译错误.但是当您使用实体时,您将收到运行时错误.


Tof*_*fee 8

关于表名的多元化可能是个问题.您可以使用下面的代码段关闭此约定.

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     base.OnModelCreating(modelBuilder);
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
 }
Run Code Online (Sandbox Code Playgroud)

  • 很好的提示 - 谢谢!:-) (2认同)

mur*_*uge 6

EF正在寻找一个名为dbo.BaseCs的表.可能是实体名称多元化问题.看看这个链接.

编辑:更新链接.


Eln*_*oor 6

如果一切正常,请ConnectionString检查数据库上下文文件中的 DbSet 集合名称。如果那个和数据库表名不匹配,你也会收到这个错误。

例如,类别、产品

public class ProductContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

应该与实际的数据库表名匹配:

在此处输入图片说明