이 오류가 발생한 경우 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 를 체크하지 않는 하나 이상 일치하는 행 응용 프로그램에서 다음은 거의 확실 가리키는 다른 데이터베이스를 보다 확인합니다.
당신이 할 수 있는 일 이를 확인하려면:
- 을 얻을 런타임 연결 문자열을 참조과 일치하는 경우에 DB 를 체크인:
기 전에 검색어를 실행하여,다음을 추가합니다:
// EF6
var connectionString = db.Database.Connection.ConnectionString;
// EF Core 5
var connectionString = db.Database.GetConnectionString();
- 가 데이터를 보면 당신은 실제로 쿼리하기:
.
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 가치,키하지 않은 독특한을 위해 충분히 이 테이블의 내용.