Entity Framework выдает исключение - недопустимое имя объекта 'dbo.BaseCs' - PullRequest
38 голосов
/ 16 октября 2011

Я следовал ответу Адама здесь , и теперь 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) ', и этот метод нельзя преобразовать в выражение хранилища.

Кто-нибудь может мне помочь?Спасибо!

Ответы [ 9 ]

58 голосов
/ 16 октября 2011

Сведения об исключении: System.Data.SqlClient.SqlException: Неверное имя объекта 'dbo.BaseCs'

Эта ошибка означает, что EF переводит ваш LINQ в оператор SQL, который использует объект (скорее всего, таблицу) с именем dbo.BaseCs, которого нет в базе данных.

Проверьте вашу базу данных и убедитесь, что эта таблица существует или вам следует использовать другое имя таблицы. Кроме того, если бы вы могли опубликовать ссылку на учебник, которому вы следуете, это помогло бы вам следовать тому, что вы делаете.

17 голосов
/ 03 июля 2013

Скорее всего, это несоответствие между именем класса модели и именем таблицы, как указано в '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; }        
}
11 голосов
/ 21 марта 2014

Если вы предоставляете сопоставления, подобные этим:

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

Не забудьте добавить карту для BaseC.

Вы не получите ошибку компиляции, если она отсутствует.Но при использовании сущности вы получите ошибку времени выполнения.

7 голосов
/ 27 июня 2017

Возможно, это проблема множественного числа имен таблиц.Вы можете отключить это соглашение, используя фрагмент кода ниже.

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     base.OnModelCreating(modelBuilder);
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
 }
6 голосов
/ 25 января 2012

EF ищет таблицу с именем dbo.BaseCs. Это может быть проблема плюрализма имени субъекта. Проверьте эту ссылку .

РЕДАКТИРОВАТЬ: Обновленная ссылка.

2 голосов
/ 20 января 2018

Если с вашим ConnectionString все в порядке, проверьте имя вашей коллекции DbSet в файле контекста вашей базы данных.Если это и имена таблиц базы данных не совпадают, вы также получите эту ошибку.

Так, например, Категории, Продукты

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

должно совпадать с фактическими именами таблиц базы данных:

enter image description here

1 голос
/ 15 февраля 2018

Вы должны определить схему и таблицу в двух разных местах.

контекст определяет схему

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");
        ...
    }
}
0 голосов
/ 01 мая 2018

вместо

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

Попробуйте:

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

, даже если имя вашей таблицы dbo.BaseCs

0 голосов
/ 16 февраля 2017

В определении контекста определите только два контекста DbSet для каждого класса контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...