it-swarm-id.com

Kerangka Entitas melempar pengecualian - Nama objek 'dbo.BaseCs' tidak valid

Saya telah mengikuti jawaban Adam di sini dan Kerangka Entitas sekarang berfungsi dan metode Seed() juga berfungsi.

Tetapi ketika saya mencoba mengakses database seperti ini:

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

Itu melempar pengecualian di return (from item in this.Users yang menyatakan:

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

Saya sudah mencoba menggantinya dengan: return this.Users.ElementAt(id); tetapi kemudian membuang pengecualian ini.

LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable1 [MySiteCreator.Models.User], Int32) ', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi store.`

Ada yang bisa bantu saya?
Terima kasih!

35
Mark Segal

Detail Pengecualian: System.Data.SqlClient.SqlException: Nama objek tidak valid 'dbo.BaseCs'

Kesalahan ini berarti bahwa EF menerjemahkan LINQ Anda ke dalam pernyataan sql yang menggunakan objek (kemungkinan besar tabel) bernama dbo.BaseCs, yang tidak ada dalam database.

Periksa database Anda dan verifikasi apakah tabel itu ada, atau Anda harus menggunakan nama tabel yang berbeda. Juga, jika Anda dapat memposting tautan ke tutorial yang Anda ikuti, akan membantu untuk mengikuti apa yang Anda lakukan.

51
Jeff Ogata

Kemungkinan besar ketidakcocokan antara nama kelas model dan nama tabel sebagaimana disebutkan oleh 'terpaut'. Jadikan ini sama atau gunakan contoh di bawah ini ketika Anda ingin menjaga nama kelas model berbeda dari nama tabel (yang saya lakukan untuk OAuthMembership). Perhatikan bahwa nama kelas model adalah OAuthMembership sedangkan nama tabelnya adalah webpages_OAuthMembership. 

Baik memberikan atribut tabel ke Model:

[Table("webpages_OAuthMembership")]
public class OAuthMembership

ATAU berikan pemetaan dengan menimpa 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; }        
}
15
acarlon

Jika Anda memberikan pemetaan seperti ini:

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

Ingatlah untuk menambahkan peta untuk BaseCs.

Anda tidak akan mendapatkan kesalahan kompilasi jika tidak ada. Tetapi Anda akan mendapatkan kesalahan runtime ketika Anda menggunakan entitas.

11
sfs

EF sedang mencari meja bernama dbo.BaseCs. Mungkin menjadi masalah pengerasan nama entitas. Lihat tautan ini .

EDIT: Tautan yang diperbarui.

6
muruge

Mungkin saya masalah tentang pluralisasi nama tabel. Anda dapat mematikan konvensi ini menggunakan cuplikan di bawah ini.

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

Jika semuanya baik-baik saja dengan ConnectionString Anda, periksa nama koleksi DbSet di file konteks db. Jika itu dan nama tabel database tidak cocok Anda juga akan mendapatkan kesalahan ini.

Jadi, misalnya, Kategori, Produk 

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

harus cocok dengan nama tabel database aktual:

 enter image description here

2
Elnoor

Anda harus mendefinisikan skema dan tabel di dua tempat yang berbeda.

konteksnya mendefinisikan skema

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());
    }
}

dan untuk setiap tabel

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

Dari pada

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

Mencoba:

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

bahkan jika nama tabel Anda adalah dbo.BaseCs

0
Wai Ng