gpt4 book ai didi

asp.net-mvc - Entity Framework DbSet.Find 抛出异常

转载 作者:行者123 更新时间:2023-12-03 17:37:56 27 4
gpt4 key购买 nike

我正在关注 ASP.NET MVC 4 中代码优先 Entity Framework (版本 4.1)的一个非常基本的示例(使用 O'Reilly 的编程 ASP.NET MVC 4 中的 EBuy 示例)。我已经为此寻找了解决方案,但到目前为止一直是空白。基本问题是我的 Controller 中的这段代码:

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 属性具有“扩展结果 View 将枚举 IEnumerable”,如果单击,它会显示我预期的两个刚刚从数据库中检索到的实体。然而,rep 对象在检查时确实有“无法评估 child ”。

像这样非常相似的“创建”代码可以正常工作:
[HttpPost]
public ActionResult Create(Auction auction)
{
var db = new EbuyDataContext();
db.Auctions.Add(auction);
db.SaveChanges();

return View(auction);
}

这是我的数据库上下文:
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 位于不同命名空间或程序集的引用文献。
有谁知道为什么 Create 代码有效而 Find 无效?

编辑:堆栈跟踪是:

System.ArgumentNullException was unhandled by user code
Message=Value cannot be null. Parameter name: key Source=mscorlib
ParamName=key StackTrace: at System.Collections.Generic.Dictionary2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary
2.ContainsKey(TKey key) at System.Data.Entity.Internal.InternalContext.TryUpdateEntitySetMappingsForType(Type entityType) at System.Data.Entity.Internal.InternalContext.IsEntityTypeMapped(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Find(Object[] keyValues)
at System.Data.Entity.DbSet
1.Find(Object[] keyValues) at Ebuy.Website.Controllers.AuctionsController.Details(Int64 id) in C:\Users\John\Documents\Visual Studio 2010\Projects\Ebuy.Website\Ebuy.Website\Controllers\AuctionsController.cs:line 26 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 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() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) at 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 运行时 4.0.30319 v4.4.0.0)。我添加了 DataAccess 项目并给它一个对 的引用。不同 EF(运行时 4.0.30319 v4.1.0.0)。我已将 DataAccess 项目的引用更改为与 Web 应用程序相同的 EF,现在出现不同的异常: InvalidOperationException 创建模型时无法使用上下文。在 N 层应用程序中使用 EF 时,这似乎是一个问题,因此我将跟进此线程并报告。

修复:我阅读了一些关于 EF 中的 LazyLoading 设置的内容,以及当您访问实体的属性时加载是如何发生的。由于在尝试查找实体属性并认为 LazyLoading 可能是 EF 5.0 中的默认值之前,我并没有真正访问实体属性,因此我向我的 EbuyDataContext 类添加了一个默认构造函数,如下所示:
public class EbuyDataContext : DbContext
{
public EbuyDataContext()
{
//Configuration.LazyLoadingEnabled = false;
}

public DbSet<Auction> Auctions { get; set; }
}

我还将 LazyLoadingEnabled 参数设置为 false,然后运行它,瞧!成功!
然而,我想我会仔细检查这个,所以我注释掉了 LazyLoadingEnabled 参数,做了一个干净的重建,它仍然有效。我注释掉了默认构造函数,现在它仍然有效 - 当我使用 LazyLoadingEnabled 参数运行它时是否有其他更改?

最佳答案

在 EF(至少 4 和 5)中,延迟加载是默认配置。此外,尝试使用 KeyAttribute 装饰将您的 Id 显式标记为 Key。

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; }
}

关于asp.net-mvc - Entity Framework DbSet.Find 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com