2012-10-30 91 views
4

我在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.Dictionary 2.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.InternalSet 1.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_ DisplayClass8 1.<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参数运行它时,有什么更改?

+0

你也可以发布stacktrace吗? – nemesv

+0

该表是否将Id列标记为主键? –

+0

哪个.net版本使用4.0或4.5?引用的'EntityFramework.dll'的确切版本号是什么? – nemesv

回答

0

在EF(至少4和5)中,延迟加载是默认配置。此外,请尝试使用KeyAttribute装饰将您的ID明确标记为密钥。

public class Auction 
{ 
    [Key] 
    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; } 
} 
+0

感谢关键装饰者的建议。 –

相关问题