我们使用模型第一种方法创建了一个Web应用程序。一位新开发人员进入该项目并使用代码优先方法(使用数据库文件)创建了一个新的自定义模型。在
这是代码第一个数据库上下文。
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属性的错误。
控制器调用错误的数据库是否有原因?
编辑:
FavoriteProject位于不同的上下文(我们的主要数据模型)中,与新的自定义模型无关。
答案 0 :(得分:3)
找到答案,但也许不是你想听到的:
“如果您使用EDMX文件的默认代码生成,则生成的类包含一系列属性,以帮助EF查找每个实体类型使用哪个类.EF目前有一个POCO类不能的限制从包含具有EF属性的类的程序集加载。(简答之,不需要,您的类需要在不同的项目中)。
这是一种有点人为的限制,我们意识到这是一种痛苦,将来会尝试删除。“
因此,解决方法是将类拆分为两个不同的程序集。
答案 1 :(得分:0)
ajpaz - 您可能必须以编程方式将现有模型“映射”到数据库表。我从错误消息中假设它正在寻找FavouriteProject表/类映射。也许数据库定义为单数,在这种情况下尝试:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<FavouriteProjects>().ToTable("FavouriteProject");
}
你还需要按照上面的方法做一个dbset(或复数的一些排列):
public DbSet<FavouriteProjects> FavouriteProjects{ get; set; }
可能会离开,只是一个想法
[edit] - 覆盖您的代码web.config中的第一个dbcontext(在connectionstrings [name 必须匹配您的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"/>