情况如下:
我们在EF5.0上有一个大数据库第一种方法的MVC项目:
ObjectContext构造函数:
namespace xxx.Models
{
(...)
public partial class xxxEntities : ObjectContext
{
#region Constructors
/// <summary>
/// (...)
/// </summary>
public xxxEntities() : base("name=xxxEntities", "xxxEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
(...)
连接字符串:
<add name="xxxEntities"
connectionString="metadata=res://*/Models.xxxModel.csdl|
res://*/Models.xxxModel.ssdl|res://*/Models.xxxModel.msl;
provider=System.Data.SqlClient;provider connection string="
data source=.;Initial catalog=xxxdb;
integrated security=True;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
我们选择Code First来测试分离命名空间的新开发.
连接字符串:
<add name="xxxCFContext"
connectionString="Data Source=.;
Initial Catalog=xxxdb;
Integrated Security=True;
User Instance=False;
MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
DbContext构造函数:
namespace xxx.Models.CodeFirst
{
public partial class xxxCFContext : DbContext
{
static xxxCFContext()
{
Database.SetInitializer<xxxCFContext>(new ValidateDatabase<xxxCFContext>());
}
public xxxCFContext()
: base("Name=xxxCFContext")
{
}
(...)
我们运行add-migrations,update-database没有问题,构建成功完成.
但是第一次使用代码优先的db访问:
xxxCFContext cfdb = new xxxCFContext();
foreach (Xobject xobject in cfdb.Xobjects)
出现错误:
“找不到概念模型类型’xxx.models.yyyclass’”,但是这个yyyclass存在于edmx中,而不是codefirst部分.
卸载EF5.0,安装EF6.0,错误消失.但我需要EF5.0而不是6.0 alfa3预发布.
怎么了?我们怎样才能将edmx与codefirst与EF5.0混合使用?
我会非常感激任何想法.
编辑
我知道这个解决方法,但对我没有帮助:
Have anyone used Entity Framework with code first approach mixed with Edmx file?
http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/
Could not find the conceptual model type
http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/
Entity Framework (4.3) looking for singular name instead of plural (when entity name ends with “s”)
Building an MVC 3 App with Database First and Entity Framework 4.1
生成(使用xxxmodel.Context.tt和xxxModel.tt)大型现有edmx的问题大大利用了ObjectContext的优点,因此我们不能简单地从ObjectContext更改为DbContext(在现有edmx之后).
编辑二
从DB First到CodeFirst,我们选择以下内容:
>从旧的edmx文件移动到代码生成.用EF 5.x DbContext Fluent Generator生成了模型对象,所以我们有了模型对象.
(右键单击EDMX编辑器并添加代码生成项.如果您似乎没有安装:工具菜单,扩展和更新,EF 5.x DbContext Fluent Generator)
>从EDMX复制模型对象和上下文.
> EDMX被删除了他身下的任何东西.
>将ConnectionString从难以处理的EDMX样式设置为简单的代码形式.
>和tadam,大约10分钟后,我们从Database First迁移到Code First.在开发期间,db中存在80个表.
>在Power Management Console中运行Enable-Migrations,然后继续使用CodeFirst.
最佳答案 将EF(代码优先,数据库优先等)的不同“类型”保存在单独的程序集中可能会有所帮助:EF
is that it is not possible use code-first in an assembly with certain database-first attributes的限制 – 尽管更新版本的EF可能会解决这个问题(也许这就是EF6 alphas工作的原因)您).