2011-08-18 3 views
6

데이터베이스에 저장하기 전에 엔티티를 업데이트 할 때의 문제를 해결하고 이상한 동작이 발생합니다.Entity Framework의 이상한 엔터티 업데이트 코드 우선

ASP.NET MVC 3 웹 응용 프로그램에서 Entity Framework 4.1 코드 우선을 사용하고 있습니다. 여기 모델입니다 :

public class Order 
{ 
    public int OrderId { get; set; } 
    public int CarId { get; set; } 
    public DateTime BeginRentDate { get; set; } 
    public DateTime EndRentDate { get; set; } 
    public decimal RentPrice { get; set; } 
    public virtual Car Car { get; set; } 
} 

public class Car 
{ 
    public int CarId { get; set; } 
    public string Brand { get; set; } 
    public string Model { get; set; } 
    public string NumberPlate { get; set; } 
    public decimal RentPrice { get; set; } 
} 

각 차마다 RentPrice가 있습니다. 이 가격은 주문을 만들 때 주문의 RentPrice로 복사해야합니다. 차는 내가 가격 값을 복사 할 Order.RentPrice 여기 0

그래서 처음에 사용자가 선택하는 것입니다 : 그것은 실체가 유효성 검사 오류가있는 SaveChanges에 오류로 인해 작동하지 않습니다

[HttpPost] 
public ActionResult Create(Order order) 
{ 
    order.RentPrice = _context.Cars.Find(order.CarId).RentPrice; 

    if (ModelState.IsValid) 
    { 
     _context.Orders.Add(order); 
     _context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(order); 
} 

. 승인. 먼저 UpdateModel(order);으로 전화를 걸어 값을 변경해야합니다.

그래서 내가 가지고있는 것. 근무 코드 :

_context.Orders.Add(order); 
UpdateModel(order); 
order.RentPrice = 777; 
_context.SaveChanges(); 

하지 작업 코드 :

_context.Orders.Add(order); 
UpdateModel(order); 
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice; 
_context.SaveChanges(); 

작동 코드는 (!) :

_context.Orders.Add(order); 
UpdateModel(order); 
var t = (double)_context.Cars.Find(order.CarId).RentPrice; 
order.RentPrice = (decimal)t; 
_context.SaveChanges(); 

누군가는 설명 할 수, 무슨 일이야하세요? 특히 마지막 코드 블록의 3 번째와 4 번째 줄에 마술이 있습니다.

는 업데이트 내가 DbEntityValidationException 받고 있어요

는 "검증은 하나 이상의 개체 실패 자세한 내용은 'EntityValidationErrors'속성을 참조하십시오.." 내부 예외에서 : "OriginalValues는 추가 상태에있는 엔티티에 사용할 수 없습니다."

+1

주문 끝에 두 개의 세미콜론이 있음을 확인 했습니까? RentPrice = _context.Cars.Find (order.CarId) .RentPrice ;; -> 마지막 코드 블록 옆에? – Jack

+1

SaveChanges 메서드의 유효성 검사 오류는 무엇입니까? 초기 Create 메서드의 코드가 제대로 작동합니다. – agradl

+0

@ 잭, 게시물을 쓰는 동안 오타가 있습니다. 결정된. –

답변

0

어디에서나 기본 키를 선언 했습니까? 당신은 FluentAPI을 사용하거나 그렇게 나 같은 속성을해야합니다

public class Order 
{ 
    [Key] 
    public int OrderId { get; set; } 
    public int CarId { get; set; } 
    public DateTime BeginRentDate { get; set; } 
    public DateTime EndRentDate { get; set; } 
    public decimal RentPrice { get; set; } 
    public virtual Car Car { get; set; } 
} 

public class Car 
{ 
    [Key] 
    public int CarId { get; set; } 
    public string Brand { get; set; } 
    public string Model { get; set; } 
    public string NumberPlate { get; set; } 
    public decimal RentPrice { get; set; } 
} 

아니면 상황에

, 당신은 내가 생각이이

builder.Entity<Car>().HasKey(x=>x.CarId); 
builder.Entity<Order>().HasKey(x=>x.OrderId); 
+0

EF는 컨벤션보다 컨벤션을 사용합니다 (이에 대해서는 Id 속성이 필요합니다). 그래서, 내 데이터베이스에는 기본 키가 있습니다. 나는 확인했다. 그리고 그 코드의 마지막 블록을 설명하는 방법은 무엇입니까? ... –

0

같은 키를 선언 유창함 API를 사용할 수 있지만, 그건 추측의 더 ... 어쩌면 당신이 그 Create 함수에 들어갈 때쯤에, 컨텍스트가 이미 그 Order를 알고 있는가? 그럴 경우 다시 추가하려고하면 오류가 발생할 수 있습니다.

코드의 마지막 부분 (놀랍게도 효과가있는 부분)에서 중첩하지 않고 중간 버전을 사용하려고 했습니까?

나는 또한 UpdateModel에 흥미가있다 ... 나는 EF를 사용하지만 MVC가 아니기 때문에 어쩌면 그것에 대해 아무 것도 할 수 없다. 그러나 그것이 커스텀 함수라면 무엇을 하는가? 당신이 얻을 때

18

는 "검증은 하나 이상의 개체 실패했습니다. 자세한 내용은 'EntityValidationErrors'속성을 참조하십시오."내부 예외에서"OriginalValues은 추가 상태에서 개체를 사용할 수 없습니다 "

그것은 같은 공백 또는 다른 제약 조건이었다 NULL NOT Collumns는 등의 오류가 있었다 의미로 엔티티 유효성 검사 오류를 확인하십시오. 디버깅 또는

try{ 
... 
catch (DbEntityValidationException ex) 
    { 
foreach (var validationErrors in ex.EntityValidationErrors) 
    { 
    foreach (var validationError in validationErrors.ValidationErrors) 
    { 
     System.Diagnostics.Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
    } 
    } 
} 
+0

질문에 내 코드 예제를 읽었습니까? –

+0

안녕하세요 정말로 원래 질문에 대한 설명이 없으므로 유감스럽게 생각합니다. DbEntityValidationException 오류가 실제로 무엇인지 얻는 방법 – John

+0

제 경우에는 내 레지스터 뷰 모델과 ID 모델간에 불일치 데이터 주석이 발견되었습니다. – Dreamcasting

0

처럼 내가 나이 전에 정류 된 것이다 문제가, 그냥 내 2 센트에 기여하고 싶었 확신합니다.

나는 또한 동일한 오류 메시지에 문제에 실행, 나는 Oracle을 사용했다 및 EF 5.0. 핀 동맹국은 12 시간 이상을 낭비한 후에 해결책을 얻었습니다.

내게는 값을 삽입하려고했던 테이블의 사용자에 대한 권한이 부족했기 때문에 오류 메시지에는 실제 사용 권한 문제에 대한 힌트가 전혀 없었습니다. 실제로는 이상한 내용이었습니다.

누군가가 유용하다고 생각하고 문제 해결에 저처럼 시간을 낭비하지 마십시오.

건배,

아비는

1

OriginalValues가 추가 된 상태에서 개체를 사용할 수 없습니다.

비 정체성 기본 키 필드가 모델 발생하지 로 지정되는 것을 보장함으로써 보정 할 수 있습니다.

modelBuilder 
    .Entity<T>() 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    // this can also be achieved using attributes on the entity. 

오류는 실제로 상황을 설명 할 때 자명하지만 그렇지 않은 경우에는 당황 스럽습니다. 데이터베이스는 삽입에 대한 두 문장을 생성의 두 번째입니다

SELECT [PrimaryKeyId] 
FROM [dbo].[Entity] 
WHERE @@ROWCOUNT > 0 AND [PrimaryKeyId] = scope_identity() 
/* SP:StmtCompleted... */ 

이 문은 비 정체성 열에 대한 행을 반환하지 않습니다. 따라서 OriginalValues은 추가 된 상태로 변경되지 않습니다. 또한 영향을받는 행 수가 기존 변경된 데이터를 감지하는 데 사용되므로이 예외가 OptimisticConcurrencyException으로 래핑 된 이유를 설명합니다.

관련 문제