Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:'데이터베이스 작업에 영향을 미칠 것으로 예상된 1row(s)하지만 실제로 영향을 받는 행 2(s)

0

질문

내가 받은 이러면 나를 업데이트 하십시오 테이블과 같은 가치(carNumber),본인의 상태가 업데이트 실제 반환 날짜 필드은 null 입니다.

몇 가지 이유로 그것의 모양처럼 쿼리를 돌아 2 행하지만,실제로 있을 뿐입니다. 내가 사용하여 EF. 이 기능:

오류 인쇄 화면

   public void updateStatus(int carNumber1, string acctualDate1)
    {
        DateTime accReturn = DateTime.Parse(acctualDate1);

        var orderCar1 =  db.CarRentalFields.FirstOrDefault(carNum =>
        (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null));

            orderCar1.ActualReturnDate = accReturn  ;
             
                db.SaveChanges();

는 오류를 올릴려고 할 때 db.문제를 재현()

테이블에서 db,자동차 번호 1000 인쇄 화면

modelBuilder.엔터티림

알려주시기 바랍 어떻게 해결할 수 있는 이 문제를 해결합니다.

c# entity-framework linq sql-server
2021-11-23 20:34:34
2
0

문제를 해결하여 새 열을 추가하 car_rental_fields 테이블,id 열 포함하는 정체성입니다. 내가 이해서 여기에 웹에서 문제가 있는 복잡한 pk. 에 나 솔루션 id 지 않는 기본 키가 있지만,그것은 논리 linq 에 대한 업데이트를 올바른 열입니다. 덕분에'모든 사람들에 관련된 이 문제를 해결합니다.

2021-11-26 20:37:27
0

이 오류가 발생한 경우 EF 를 해결할 수 없 PK 에 대한 귀하의 entity. 대부분의 경우에 대한 간단한 단체,EF 규칙을 작업 할 수 있습니다 PK,하지만 경우에 당신을 사용하는 복합 열쇠 그래서 이를 구성해야 합니다. 는 방법에 따라 당신은 매핑체 이를 수행할 수 있습에서 하나:

  • 는 EDM
  • 에 DbContext.OnModelCreating
  • 를 사용하는 EntityTypeConfiguration 선언
  • 사용 특성은 엔터티 내에서 자신

때문에 우리가 알지 못하는 방법 당신의 엔티티 구성되,이를 확인할 수 있습으로 원인을 사용하여 특성 접근 방식에서 당신의 엔티티로 테스트합니다. 를 사용하는 경우에는 EDM entity 클래스에 생성됩니다 그래서 당신이 원하는 것이 이것을 대체로 구성 내시겠. (할 수 없는 정말 당신을 도움이기 때문에 나는 사용하지 않 dang 일:D)

당신은 아마 다음과 같습니다.

public class CarRentalFields
{
    [Column("start_day")]
    public DateTime StartDay { get; set; }
    [Column("return_date")]
    public DateTime ReturnDate { get; set; }
    [Column("user_id")]
    public int UserId { get; set; }
    [Column("car_number")]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

할 수 있도 [Key] 특성에 중 하나 이러한 필드와 같은 CarNumber. 이 있는 경우 PK 매핑에서 entity 문제가 없다는 충분히 특정을 고유하게 식별합니다. 때 EF 간 업데이트 하나의 엔티티를 확인하려와 기대를 업데이트 하나만 행 테이블에 있습니다. 그것은 찾는 하나 이상의 행 영향을 받을 것이 그래서 그것은 실패합니다.

추가 특성 [Key] 와 열기 위해서 그것으로 인식하고 composite key.

public class CarRentalFields
{
    [Key, Column(Name="start_day", Order=1)]
    public DateTime StartDay { get; set; }
    [Key, Column(Name="return_date", Order=2)]
    public DateTime ReturnDate { get; set; }
    [Key, Column(Name="user_id", Order=3)]
    public int UserId { get; set; }
    [Key, Column(Name="car_number", Order=4)]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

제공하는 4 이러한 열을 보장하는 독특한 제약 조건에서 테이블,EF 이 만족될 경우 하나의 행만입 업데이트 빌드할 때 그것이 업데이트 SQL statement.

참고 다시는 이 작품을 사용하고 있는 데이터는,당신은 필요가 검토 및 수정 데이터를 매핑하는 적절한 변경 이후에는 엔티티 등 수생을 잃고,귀하의 추가 특성이 있습니다. (나는 믿고 생성된 엔터티 클래스에서는 EDM 의견 헤더는 경고 그것은 생성되는 등,그래서는 지표에 대한 조심.)

업데이트: 내 차에서 의심되는 것이는 테이블의하지 않는 실제로 일치 PK 정의,실행 중이거나 다른 PK 조합이나 더 많은 가능성이 없 PK 주어진 자연을 그들의 필드가 있습니다. EF 할 수 있는 운영하는 테이블에서 없 PK 정의되지만,필요한 핵심 정의하는 기록 보장할 수 있습 고유하게 식별됩니다. 오류에 당신을 보고 있을 때 발생하는 키를 정의하지 않은 독특한 충분합니다. (I.e. 업데이트하는 경우에는 1 차 및 행을 선택하는가: car_number=1,start_day=2021-11-21,return_day=2021-11-22,user_id=0 문제는 하나 이상의 행이는 조합에서 DB. 는 경우에 DB 를 체크하지 않는 하나 이상 일치하는 행 응용 프로그램에서 다음은 거의 확실 가리키는 다른 데이터베이스를 보다 확인합니다.

당신이 할 수 있는 일 이를 확인하려면:

  1. 을 얻을 런타임 연결 문자열을 참조과 일치하는 경우에 DB 를 체크인:

기 전에 검색어를 실행하여,다음을 추가합니다:

// EF6
var connectionString = db.Database.Connection.ConnectionString;
// EF Core 5
var connectionString = db.Database.GetConnectionString();
  1. 가 데이터를 보면 당신은 실제로 쿼리하기:

.

var cars =  db.CarRentalFields.Where(carNum =>
    (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null)).ToList();

이 쿼리를 반환할 수 있습니다 단지 1 기록하지 않은 문제의 원인. 당신이 원하는 무엇입니 CarNumber,보,ReturnDate 및 UserId 이 레코드:

var car =  db.CarRentalFields
    .Where(carNum => carNum.CarNumber == carNumber1 
        && carNum.ActualReturnDate == null)
    .Select(x => new 
    {
        x.CarNumber,
        x.StartDay,
        x.ReturnDate,
        x.UserId
    }).Single(); // Expect our 1 record here...
var cars = db.CarRentalFields
    .Where(x => x.CarNumber == car.CarNumber
        && x.StartDay == car.StartDay
        && x.ReturnDate == car.ReturnDate
        && x.UserId == car.UserId)
    .ToList(); // Get rows that match our returned Key fields.

이러한 쿼리를 선택 가정 PK 값을 자동차에 대한 기록을 의미하는데,그 자동차를 검색하고 일치에 대한 기록으로 예상되는 열쇠 필드가 있습니다. 나의 돈에 있는 동안 최고 쿼리는 1 을 반환하고 기록은,하단 쿼리가 반환하는 두 개의 행이 의미하는 동안에만 1 기록하는#null ActualReturnDate 가치,키하지 않은 독특한을 위해 충분히 이 테이블의 내용.

2021-11-26 22:57:48

내가 사용하여 텍스에서,당신은 나의 인쇄 화면의 모니다.
elirans

Yes ok 그것을 사용하여 DbContext 의 OnModelCreating modelBuilder,그래서 키를 정의됩니다. 다음 것을 확인하는 것은 그 열에 맞 PK/w 독특한 제약 조건에 해당하는 데이터베이스입니다. 하지 않을 경우,해당 키에도 확대되어야 합니다. 복합 열쇠를 피해야 한다 가능한 한 많으로 그들의 관계 설정 더 많은 작동합니다. 사용할 수도 있습니다 프로파일러를 캡처하 제안 업데이트 문,변환로는 간단한 선택을 볼 무엇을 행 반환됩니다. 어떤 이유로 하나 이상의 행이 있습니다.
Steve Py

다른 것을 확인하는지 여부를 런타임 시에는 응용 프로그램은 데이터베이스로 무엇을 확인합니다. 데이터 당신은 당신이 나타날 수 있을만큼 독특한 경우에 DB 를 적용되지 않습는 독특한 제약 조건에 이러한 열을,그러나고 있는 데이터베이스에서 지적 런타임은 복제 행이 있습니다.
Steve Py

같은 오류가 사용하여 발생하는 솔루션을 필요로 했을 변경하는 기능도? @스티브 Py
elirans

캡처 SQL 생성 및 실행은 데이터베이스에 있습니다. 나는 일반적으로 사용하여 프로파일러는 이를 위해,그래서 SQL 서버 및 SSMS 서 도구\SQL 프로파일. 실행하는 것에 대한 귀하의 DB,다음을 실행하는 쿼리가 있습니다. 사용할 수 있습니다점 응용 프로그램에 바로 전에 문제를 재현,다음 명확한 프로파일러를 출력하기 전에 다시 시작하는 청소 이전 소음이하고 당신의 업데이트 문입니다.
Steve Py

또한,당신은 테이블의 디자이너에 대한 출력 테이블? 는 테이블이 있는 실제적인 PK 설정하는 사람들과 4 란?
Steve Py

를 추가하는 응답을 포함하는 단계크 연결 문자열을 뿐만 아니라인에서 데이 있는지 여부도 중복되는 키 값입니다.
Steve Py

나의 솔루션을 제공합니다. 먼저 그것의 당신처럼 미스 일부는'='에서 자동차 var. 두번째 경우를 만들려고 업데이트:자동차입니다.ActualReturnDate=acctualDate1;난류 cs1061.
elirans

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................