web-dev-qa-db-ja.com

Entity Frameworkが例外をスローする-無効なオブジェクト名「dbo.BaseCs」

Adamの答え here に従い、Entity Frameworkが動作するようになり、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) 'メソッド。このメソッドはストア式に変換できません。

誰も私を助けることができますか?
ありがとうございました!

39
Mark Segal

例外の詳細:System.Data.SqlClient.SqlException:無効なオブジェクト名 'dbo.BaseCs'

このエラーは、EFがLINQを、データベースに存在しないdbo.BaseCsという名前のオブジェクト(ほとんどの場合テーブル)を使用するsqlステートメントに変換していることを意味します。

データベースを調べて、そのテーブルが存在するかどうか、または別のテーブル名を使用する必要があるかどうかを確認してください。また、フォローしているチュートリアルへのリンクを投稿できる場合は、あなたがやっていることをフォローするのに役立ちます。

59
Jeff Ogata

'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; }        
}
17
acarlon

このようなマッピングを提供している場合:

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

BaseCのマップを忘れずに追加してください。

見つからない場合、コンパイルエラーは発生しません。ただし、エンティティを使用すると実行時エラーが発生します。

12
sfs

テーブル名の複数形化に関する問題かもしれません。以下のスニペットを使用して、この規則をオフにすることができます。

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

EFはdbo.BaseCsという名前のテーブルを探しています。エンティティ名の複数形の問題である可能性があります。これを確認してください link

EDIT:リンクを更新しました。

6
muruge

ConnectionStringで問題がなければ、dbコンテキストファイルのDbSetコレクション名を確認してください。それとデータベースのテーブル名が一致しない場合、このエラーも発生します。

したがって、たとえば、Categories、Products

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

実際のデータベーステーブル名と一致する必要があります。

enter image description here

2
Elnoor

スキーマとテーブルの両方を2つの異なる場所で定義する必要があります。

コンテキストはスキーマを定義します

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");
        ...
    }
}
1
Carlo V. Dango

の代わりに

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

試してください:

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

テーブル名がdbo.BaseCsであっても

0
Wai Ng