web-dev-qa-db-fra.com

Entity Framework lève une exception - Nom d'objet non valide 'dbo.BaseCs'

J'ai suivi la réponse d'Adam ici et Entity Framework fonctionne maintenant et la méthode Seed() fonctionne également.

Mais quand j'essaie d'accéder à la base de données comme ceci:

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

Il lève une exception à return (from item in this.Users en indiquant:

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

J'ai essayé de le remplacer par: return this.Users.ElementAt(id); mais ensuite, cette exception est levée.

LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable1 [MySiteCreator.Models.User], Int32) ', et cette méthode ne peut pas être traduite en expression de magasin. »

Quelqu'un peut-il m'aider?
Je vous remercie!

35
Mark Segal

Détails des exceptions: System.Data.SqlClient.SqlException: nom d'objet non valide 'dbo.BaseCs'

Cette erreur signifie que EF traduit votre LINQ en une instruction SQL utilisant un objet (très probablement une table) nommé dbo.BaseCs, qui n'existe pas dans la base de données.

Vérifiez votre base de données et vérifiez si cette table existe ou si vous utilisez un nom de table différent. En outre, si vous pouviez publier un lien vers le didacticiel que vous suivez, il serait utile de suivre ce que vous faites.

51
Jeff Ogata

Il y a probablement une discordance entre le nom de la classe de modèle et le nom de la table tel que mentionné par 'adrift'. Faites-les identiques ou utilisez l'exemple ci-dessous pour conserver le nom de la classe de modèle différent du nom de la table (ce que j'ai fait pour OAuthMembership). Notez que le nom de la classe de modèle est OAuthMembership alors que le nom de la table est webpages_OAuthMembership. 

Soit fournir un attribut de table au modèle:

[Table("webpages_OAuthMembership")]
public class OAuthMembership

OU fournissez le mappage en surchargeant 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

Si vous fournissez des mappages comme celui-ci:

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

N'oubliez pas d'ajouter la carte pour BaseCs.

Vous n'obtiendrez pas d'erreur de compilation si elle manque. Mais vous obtiendrez une erreur d'exécution lorsque vous utiliserez l'entité.

11
sfs

EF recherche une table nommée dbo.BaseCs. Peut-être un problème de pluralisation du nom d’entité. Découvrez ce link .

EDIT: Lien mis à jour.

6
muruge

Cela pourrait me poser un problème de pluralisation des noms de table. Vous pouvez désactiver cette convention à l'aide de l'extrait ci-dessous.

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

Si tout va bien avec votre ConnectionString, vérifiez le nom de votre collection DbSet dans votre fichier de contexte db. Si cela ne correspond pas aux noms de table de base de données, vous obtiendrez également cette erreur.

Ainsi, par exemple, catégories, produits 

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

doit correspondre aux noms de table de base de données réels:

 enter image description here

2
Elnoor

Vous devez définir le schéma et la table à deux endroits différents.

le contexte définit le schéma

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

et pour chaque table

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

Au lieu de

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

Essayer:

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

même si votre nom de table est dbo.BaseCs

0
Wai Ng