从EF4更新到EF6(修改了一些引用的命名空间),发现以下语句在EF4上是OK的,更新到6后编译错。
var articles = entities.Articles.Include("User")
.Where("it.User.UserName = @UserName", new ObjectParameter("UserName", UserName))
说没有这样的Where方法。
entities.Articles.Include("User")这个本来得到的类型是ObjectQuery,EF6里怎么就变成DbQuery了?
还有
if (!userPage.PageDetails.IsLoaded)
{
userPage.PageDetails.Load();
}
这个IsLoaded和Load都出错,EF6不需要这两个东西吗?
还有
db.HomeAds.Attach(homead);
db.ObjectStateManager.ChangeObjectState(homead, EntityState.Modified);
db.SaveChanges();
这个ObjectStateManager不能没了吗?
哦,这个ObjectStateManager解决了,可以用以下代替:
db.Entry(homead).State = EntityState.Modified;
不知道你有没有区分 Db-First 和 Code-First?
用的是Db-First,我再查查资料。。。
@灰灰狼: db.ObjectStateManager 这是 db-first 的,db.Entry 这是 code-first 的。
@Launcher: 一起用的是DB First,但是貌似EF6生成的表对象不包含Attach方法了,而且调用了Include方法的表对象的返回值类型也变了
@灰灰狼: 也可能是版本太乱了,EF4,5,6都引用过,晚上回家再仔细看看。
@灰灰狼: 请你仔细的区分 Db-First 和 Code-First。你得看你的 db 的基类是什么,在 Code-First 下, DbContext.DbSet<T> 确实有 Attach 方法:http://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx。
而 Db-Frist 下,是 ObjectSet<T> 有 Attach 方法:
http://msdn.microsoft.com/zh-cn/library/vstudio/dd412719(v=vs.110).aspx
但是请注意,它是跟着 .Net Framework 版本走的,同 Code-First 的不一样。
@Launcher:
这就是DB First吧,以前就是这样建的,现在用的是VS2013,EF6,看了生成的db类是DbContext,表对象也是DbSet,不知道是不是EF6里的新变化,还是我建的方法不对。
@灰灰狼: 我就是告诉你区别,因为你对为什么 6 上编译不通过有疑问,而我告诉你的是请看你的 db 的基类。我跟你说了 Code-First 一直都是用 DbContext,而 Db-First 是跟随 .Net Framework 版本走的。你能明白我的意思吗?理解了你的 db 的基类是什么后,这个问题解决起来很困难吗?
@Launcher: 明白了,可以解决了,也充了几个小时的电,知道怎么做了,多谢。