2012-10-30 3 views
4

ASP.NET MVC 4에서 코드 기반 Entity Framework (버전 4.1)의 매우 기본적인 예제를 수행합니다 (O'Reilly의 프로그래밍 ASP.NET MVC 4에서 EBuy 예제 사용). . 나는 이것에 대한 해결책을 찾고 지금까지 아무 것도 모른 채 찾아 냈다. 기본적인 문제는 내 컨트롤러에서이 코드 :Entity Framework DbSet.Find가 예외를 throw합니다.

public ActionResult Details(long id) 
    { 
     using (var db = new EbuyDataContext()) 
     { 
      var rep = db.Auctions; 
      var auction = rep.Find(id); 
      return View(auction); 
     } 
    } 

경우 ArgumentNullException 값이 null 일 수 없습니다 던졌습니다. 매개 변수 이름 : 키.이 rep.Find (id) 호출에 도달하면. 흥미롭게도 코드에 침입하면 db.Auctions 속성에 '결과보기를 확장하면 IEnumerable이 열거됩니다.'가 표시되고 클릭하면 데이터베이스에서 방금 가져온 두 개의 예상 엔티티가 표시됩니다. 그러나 rep 객체는 검사 할 때 '어린이를 평가할 수 없습니다'라는 메시지를 표시합니다.

아주 유사한 '작성'과 같은 코드가 괜찮 작동합니다

[HttpPost] 
    public ActionResult Create(Auction auction) 
    { 
     var db = new EbuyDataContext(); 
     db.Auctions.Add(auction); 
     db.SaveChanges(); 

     return View(auction); 
    } 

이 내 DB 컨텍스트입니다 :

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

I POCO와 dbcontext가 서로 다른 네임 스페이스 또는 어셈블리에 있다고 언급 한 참조를 찾았습니다. 누구나 Create 코드가 작동하고 Find가 작동하지 않는 이유를 알고 있습니까?

편집 : 스택 트레이스는 다음과 같습니다

System.ArgumentNullException은 = 값이 null 일 수 없습니다 사용자 코드에 의해
메시지 처리되지 않은이었다. 매개 변수 이름 : 키 소스 = 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.Linq.InternalSet 1.Find(Object[] keyValues) at System.Data.Entity.DbSet에서 System.Data.Entity.Internal.InternalContext.IsEntityTypeMapped (유형 entityType) 에서 1.Find는 Ebuy.Website.Controllers.AuctionsController에서 를 ([] 된 KeyValues ​​개체). 세부 정보 (Int64 ID) C : \ Users \ John \ Documents \ Visual Studio 2010 \ Projects \ Ebuy.Website \ Ebuy.Website \ Controllers \ AuctionsController.cs : 줄 26백45경1천5백15조5백36억9천1백36만3천2백10 lambda_method에서 controllerContext, IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext에서 ([] 파라미터 객체 ControllerBase 컨트롤러)에 System.Web.Mvc.ActionMethodDispatcher.Execute 을 를 (폐쇄가 ControllerBase는 [] 오브젝트) 2 매개 변수) at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c_ DisplayClass42.b _41() at System.Web.Mvc.Async.AsyncResultWrapper System.Web.Mvc.Async.AsyncControllerActionInvoker에서 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod (IAsyncResult를 asyncResult) 에서 <> C_ DisplayClass8 1.<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.End() . <> c _DisplayClass37. <> c_ DisplayClass39b _33() at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C_ DisplayClass4f.b _49() 의 InnerException :

편집 2 표는 기본 키 ID 열을 가지고있다. 업데이트 : nemesv의 의견에 따라 버전을 확인했습니다. .NET Framework v 4.0을 사용하고 있습니다. MVC 웹 앱을 만들면 Nuget을 사용하여 EF 버전 5.0을 얻을 수 있습니다 (실제 참조는 EF 런타임 4.0.30319 v4.4.0.0 임에도 불구하고). DataAccess 프로젝트를 추가하고 EF (런타임 4.0.30319 v4.1.0.0)에 대한 참조를 제공했습니다. DataAccess 프로젝트의 참조를 웹 응용 프로그램과 동일한 EF로 변경했는데 이제는 다른 예외가 발생합니다. InvalidOperationException 모델을 만드는 동안 컨텍스트를 사용할 수 없습니다. 이것은 N 계층 응용 프로그램에서 EF를 사용할 때 문제가되는 것으로 보입니다. 따라서이 스레드를 추적하여보고합니다.

수정 : EF의 LazyLoading 설정과 엔티티의 속성에 액세스 할 때로드가 수행되는 방식에 대해 읽었습니다.

public class EbuyDataContext : DbContext 
{ 
    public EbuyDataContext() 
    { 
     //Configuration.LazyLoadingEnabled = false; 
    } 

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

또한 설정 : 정말 내가 시도하고 하나를 발견하기 전에 개체의 속성에 액세스 아마도 LazyLoading는 EF 5.0의 기본이라고 생각하고 있지 않다으로 다음과 같이 내 EbuyDataContext 클래스에 기본 생성자를 추가 LazyLoadingEnabled 매개 변수를 false로 설정하고 실행하면 Voila! 성공! 그러나 나는 이것을 재확인 할 것이라고 생각했기 때문에 LazyLoadingEnabled 매개 변수를 주석 처리하고 깨끗한 재 작성을 수행했으며 여전히 작동했습니다. 기본 생성자를 주석 처리하고 이제는 여전히 작동합니다. LazyLoadingEnabled 매개 변수를 사용하여 실행하면 다른 변경이 있습니까?

+0

스택 트레이스를 게시 할 수 있습니까? – nemesv

+0

테이블에 기본 키로 표시된 Id 열이 있습니까? –

+0

4.0 또는 4.5를 사용중인 .net 버전은 무엇입니까? 참조 된 '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

키 꾸미기 제안에 감사드립니다. –

관련 문제