我在ASP.NET MVC 4中使用代码优先的实体框架(版本4.1)的一个非常基本的例子(使用O'Reilly编程ASP.NET MVC 4中的EBuy示例) 。我已经找到了解决这个问题的方法,到目前为止都已经画成空白。基本的问题是这样的代码在我的控制器:实体框架DbSet.Find抛出异常
public ActionResult Details(long id)
{
using (var db = new EbuyDataContext())
{
var rep = db.Auctions;
var auction = rep.Find(id);
return View(auction);
}
}
抛出ArgumentNullException值不能为空。参数名称:键。当它击中rep.Find(id)调用。有趣的是,当它分解代码时,db.Auctions属性具有'扩展结果视图将枚举IEnumerable',如果单击它,它会显示我刚刚从数据库中检索到的两个预期实体。然而,代表对象在检查时确实存在“儿童无法评估”。
神似 '创建' 这样的代码工作好:
这是我的分贝背景:
namespace Ebuy.DataAccess
{
public class EbuyDataContext : DbContext
{
public DbSet<Auction> Auctions { get; set; }
}
}
,这是我的模型类:
namespace Ebuy.DomainModel
{
public class Auction
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public decimal StartPrice { get; set; }
public decimal CurrentPrice { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
}
我确实找到了一个引用,它提到了POCO和dbcontext存在于不同的名称空间或程序集中。 有谁知道为什么创建代码的作品和查找不?
编辑:的堆栈跟踪是:
System.ArgumentNullException了未处理由用户代码
消息=值不能为空。参数名:键源= mscorlib程序
PARAMNAME =键堆栈跟踪: 在System.Collections.Generic.Dictionary2.FindEntry(TKey key) at System.Collections.Generic.Dictionary
2.ContainsKey(TKEY的键) 在System.Data.Entity.Internal.InternalContext.TryUpdateEntitySetMappingsForType(类型 的EntityType) System.Data.Entity.Internal.InternalContext.IsEntityTypeMapped(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Find(Object[] keyValues) at System.Data.Entity.DbSet
1.在Ebuy.Website.Controllers.AuctionsController找到(Object [] keyValues) 。详细信息(Int64 id)在C:\ Users \ John \ Documents \ Visual Studio中 2010 \ Projects \ Ebuy.Website \ Ebuy.Website \ Controllers \ AuctionsController.cs:行在lambda_method在System.Web.Mvc.ActionMethodDispatcher.Execute在System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary的2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
(封闭,ControllerBase,对象[]) (ControllerBase控制器,对象[]参数) parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> c_ DisplayClass42.b _41() at System.Web.Mvc.Async.AsyncResultWrapper。 <> C_ DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult
1.End() 在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult的 asyncResult) 在System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> c _DisplayClass37。 <> c_ DisplayClass39。b _33() at System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> C_ DisplayClass4f.b _49() 的InnerException:
编辑2:表确实有Id列作为主键。 更新:根据nemesv的评论,我检查了版本。我正在使用.NET Framework v 4.0。 MVC Web应用程序创建时使用Nuget获取EF版本5.0(尽管实际引用是EF runtime 4.0.30319 v4.4.0.0)。我添加了DataAccess项目并给它提供了一个不同的 EF(运行时4.0.30319 v4.1.0.0)。我已经将DataAccess项目的引用更改为与Web应用程序相同的EF,现在我得到了一个不同的异常:InvalidOperationException模型创建时无法使用上下文。在N层应用程序中使用EF时,这似乎是一个问题,所以我会跟进此线程并报告回来。
修复:我读了一些关于EF中LazyLoading设置的内容,以及在访问实体属性时如何进行加载。因为我没有真正访问一个实体的属性之前,我试图找到一个和思考,也许惰性加载在EF 5.0的默认,我添加了一个默认的构造函数我EbuyDataContext类,如下所示:
public class EbuyDataContext : DbContext
{
public EbuyDataContext()
{
//Configuration.LazyLoadingEnabled = false;
}
public DbSet<Auction> Auctions { get; set; }
}
我还设置将LazyLoadingEnabled参数设置为false,然后运行它和Voila!成功! 但是,我想我会仔细检查这一点,所以我评论了LazyLoadingEnabled参数,做了一个干净的重建,它仍然工作。我注释掉了默认的构造函数,现在它仍然有效 - 当我使用LazyLoadingEnabled参数运行它时,有什么更改?
你也可以发布stacktrace吗? – nemesv
该表是否将Id列标记为主键? –
哪个.net版本使用4.0或4.5?引用的'EntityFramework.dll'的确切版本号是什么? – nemesv