Сначала смешивать модель и сначала код - PullRequest
7 голосов
/ 01 августа 2011

Мы создали веб-приложение, используя модель сначала. В проект вошел новый разработчик и создал новую пользовательскую модель, используя подход «сначала код» (файл базы данных).

Вот код первого контекста базы данных.

namespace WVITDB.DAL
{
public class DashboardContext : DbContext
{
    public DbSet<CTOReview> CTOReviews { get; set; }
    public DbSet<Concept> Concepts { get; set; }

    //public DashboardContext()
    //    : base("name=DashboardContext")
    //{

    //}


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

Следующий метод контроллера выдает ошибку Could not find the conceptual model type for 'WVITDB.Models.FavoriteProject'. и ссылается на исходную модель базы данных. Мы не уверены, почему (или как) это так называется.

  public ViewResult Index()
        {
            var d = db.Concepts.ToList(); //Throws error here
            return View("Index",d);
        }

Когда создается экземпляр DashboardContextclass, ошибка отображается для обоих свойств DBset.

Есть ли причина, по которой контроллер вызывает неверную базу данных?

EDIT:

FavoriteProject находится в другом контексте (наша основная модель данных) и не связан с новой пользовательской моделью.

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Нашел ответ, может быть, это не то, что вы хотите услышать, хотя:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d2a07542-cb33-48ba-86ed-4fdc70fb3f1a

"Если вы используете генерацию кода по умолчанию для файла EDMX, то сгенерированные классы содержат ряд атрибутов, чтобы помочь EF найти, какой класс использовать для каждого типа сущности. В настоящее время EF имеет ограничение, что классы POCO не могут быть загружается из сборки, содержащей классы с атрибутами EF. (Краткий ответ - нет, ваши классы должны находиться в отдельных проектах).

Это несколько искусственное ограничение, и мы понимаем, что что-то болезненное и постарается устранить в будущем. "

Так что обходной путь - разделить классы на две разные сборки.

0 голосов
/ 01 августа 2011

ajpaz - возможно, вам придется «привязать» существующую модель к таблице базы данных программно. Я предполагаю из сообщения об ошибке, что он ищет таблицу / класс FavouriteProject. может быть, БД определил это как единственное число, в этом случае попробуйте:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<FavouriteProjects>().ToTable("FavouriteProject");
}

вам также потребуется выполнить набор данных в dbset, как указано выше (или некоторую перестановку множественного числа):

public DbSet<FavouriteProjects> FavouriteProjects{ get; set; }

может быть за несколько миль, просто мысль

[править] - переопределение вашего кода 1-й dbcontext в web.config (в строках соединения [имя ДОЛЖНО соответствовать вашему имени dbcontext]):

<add name="DashboardContext" connectionString="Data Source=remote.sqlserver.server;Initial Catalog=code_first_db;Persist Security Info=True;MultipleActiveResultSets=True;User ID=code_first_db_user;Password=password" providerName="System.Data.SqlClient"/>
...