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

时间:2011-10-16 11:52:37

标签: c# sql asp.net-mvc-3 entity-framework

我遵循了Adam的回答here,现在实体框架正常运作,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));
    }

它在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.IQueryable 1 [MySiteCreator.Models.User],Int32)'方法,此方法无法转换为商店表达式。

任何人都可以帮助我吗? 谢谢!

15 个答案:

答案 0 :(得分:56)

  

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

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

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

答案 1 :(得分:17)

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

为模型提供表属性:

[Table("webpages_OAuthMembership")]
public class OAuthMembership

通过重写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; }        
}

答案 2 :(得分:11)

如果你提供这样的映射:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ClassificationMap());
        modelBuilder.Configurations.Add(new CompanyMap());
        modelBuilder.Configurations.Add(new GroupMap());
        ....  
    }

请记住为BaseCs添加地图。

如果丢失,您将不会收到编译错误。但是当您使用实体时,您将收到运行时错误。

答案 3 :(得分:6)

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

编辑:更新了链接。

答案 4 :(得分:6)

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

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

答案 5 :(得分:2)

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

因此,例如, 类别,产品

public class ProductContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
}

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

enter image description here

答案 6 :(得分:1)

您必须在两个不同的位置定义架构和表。

上下文定义了架构

public class BContext : DbContext
{
    public BContext(DbContextOptions<BContext> options) : base(options)
    {
    }

    public DbSet<PriorityOverride> PriorityOverrides { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.HasDefaultSchema("My.Schema");

        builder.ApplyConfiguration(new OverrideConfiguration());
    }
}

和每个表

class PriorityOverrideConfiguration : IEntityTypeConfiguration<PriorityOverride>
{
    public void Configure(EntityTypeBuilder<PriorityOverride> builder)
    {
        builder.ToTable("PriorityOverrides");
        ...
    }
}

答案 7 :(得分:1)

我不知道是不是

如果在添加DbSet之前创建迁移,则您的sql表将具有模型名称,通常以单数形式或按照惯例,我们使用复数形式命名DbSet。

因此,请尝试验证您的DbSet名称是否与表相同。如果不是,请尝试更改配置。

答案 8 :(得分:1)

很可能翻译后的 SQL 语句找不到表名。

就我而言,该表已分配给不同的架构。因此,在模型中,您应该像这样输入表的模式定义:

[Table("TableName", Schema = "SchemaName")]
public class TableName
{

}

答案 9 :(得分:0)

而不是

modelBuilder.Entity<BaseCs>().ToTable("dbo.BaseCs");

尝试:

modelBuilder.Entity<BaseCs>().ToTable("BaseCs");

即使您的表格名称为dbo.BaseCs

答案 10 :(得分:0)

对于它的价值,我想提到的是,问题出在AFTER INSERT触发器上!

这些不是超级可见,因此您可能需要搜索一段时间!

答案 11 :(得分:0)

我的修复非常简单,只需确保所有appsettings.json文件中都有正确的连接字符串,而不仅仅是默认的字符串即可。

答案 12 :(得分:0)

在 EF (Core) 配置(数据注解和 fluent API)中,表名与架构分开。

删除“dbo”。从表名并使用带有名称和架构参数的 ToTable 重载:

.ToTable("MyUsers", "dbo");

或者考虑到 dbo 是默认架构(如果没有以不同方式配置),只需:

.ToTable("MyUsers");

就目前而言,它认为表 dbo.dbo.MyUsers 当然不存在。

答案 13 :(得分:0)

当我查看正在测试的项目的配置时,我的测试中的数据库配置错误。

答案 14 :(得分:-2)

在上下文定义中,每个上下文类只定义两个DbSet上下文。