Подтвердить что ты не робот

Entity Framework исключает исключение - Недопустимое имя объекта 'dbo.BaseCs'


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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Скорее всего, это несоответствие между именем класса модели и именем таблицы, как упоминалось в "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; }        
}

Ответ 3

Если вы предоставляете сопоставление следующим образом:

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

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

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

Ответ 4

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

EDIT: Обновлена ​​ссылка.

Ответ 5

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

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

Ответ 6

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

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

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

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

введите описание изображения здесь

Ответ 7

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