webentwicklung-frage-antwort-db.com.de

Entity Framework löst Ausnahme aus - Ungültiger Objektname 'dbo.BaseCs'

Ich folgte Adams Antwort hier und das Entity Framework funktioniert jetzt und die Seed()-Methode funktioniert auch.

Aber wenn ich versuche, so auf die Datenbank zuzugreifen:

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

Bei return (from item in this.Users wird eine Ausnahme ausgelöst, die Folgendes angibt:

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

Ich habe versucht, es durch Folgendes zu ersetzen: return this.Users.ElementAt(id);, aber dann wird diese Ausnahme ausgelöst.

LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable1 [MySiteCreator.Models.User], Int32) 'Methode, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.`

Kann mir jemand helfen?
Vielen Dank!

35
Mark Segal

Ausnahmedetails: System.Data.SqlClient.SqlException: Ungültiger Objektname 'dbo.BaseCs'

Dieser Fehler bedeutet, dass EF Ihre LINQ in eine SQL-Anweisung übersetzt, die ein Objekt (höchstwahrscheinlich eine Tabelle) mit dem Namen dbo.BaseCs verwendet, das in der Datenbank nicht vorhanden ist.

Überprüfen Sie Ihre Datenbank und überprüfen Sie, ob diese Tabelle vorhanden ist oder ob Sie einen anderen Tabellennamen verwenden sollten. Wenn Sie einen Link zu dem von Ihnen verfolgten Lernprogramm posten könnten, wäre es hilfreich, mitzuverfolgen, was Sie tun.

51
Jeff Ogata

Es ist höchstwahrscheinlich eine Nichtübereinstimmung zwischen dem Namen der Modellklasse und dem Tabellennamen, wie er von "adrift" erwähnt wird. Nehmen Sie die gleichen Einstellungen vor oder verwenden Sie das Beispiel unten, wenn Sie den Namen der Modellklasse vom Tabellennamen unterscheiden möchten (was ich für OAuthMembership getan habe). Beachten Sie, dass der Name der Modellklasse OAuthMembership ist, während der Tabellenname webpages_OAuthMembership ist. 

Geben Sie entweder ein Tabellenattribut für das Modell an:

[Table("webpages_OAuthMembership")]
public class OAuthMembership

ODER stellen Sie die Zuordnung bereit, indem Sie DBContext OnModelCreating überschreiben: 

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

Wenn Sie Mappings wie folgt bereitstellen:

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

Denken Sie daran, die Karte für BaseCs hinzuzufügen.

Sie erhalten keinen Kompilierungsfehler, wenn er fehlt. Sie erhalten jedoch einen Laufzeitfehler, wenn Sie die Entität verwenden.

11
sfs

EF sucht nach einer Tabelle mit dem Namen dbo.BaseCs. Könnte ein Entity-Name sein, bei dem es um das Pluralisieren von Namen geht. Schauen Sie sich diesen Link an.

EDIT: Link aktualisiert.

6
muruge

Es könnte ein Problem mit dem Pluralisieren von Tabellennamen sein. Sie können diese Konvention mit dem folgenden Snippet deaktivieren.

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

Wenn mit ConnectionString alles in Ordnung ist, überprüfen Sie den Namen Ihrer DbSet-Sammlung in Ihrer DB-Kontextdatei. Wenn diese und die Namen der Datenbanktabellen nicht übereinstimmen, wird auch diese Fehlermeldung angezeigt.

So zum Beispiel Kategorien, Produkte 

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

sollte mit den tatsächlichen Datenbanktabellennamen übereinstimmen:

 enter image description here

2
Elnoor

Sie müssen das Schema und die Tabelle an zwei verschiedenen Stellen definieren.

der Kontext definiert das Schema

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

und für jeden Tisch

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

Anstatt

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

Versuchen:

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

auch wenn der Name Ihrer Tabelle dbo.BaseCs ist

0
Wai Ng