这一错误发生时EF无法解决的PK你的实体。 在大多数情况下,简单的实体,EF公约可以作出的PK,但在你的情况下,您使用的是一种复合的关键因此,这需要进行配置。 取决于你如何射你的实体,你可以做到这一点无论是:
- EDMX
- 在代码的第.OnModelCreating
- 使用
EntityTypeConfiguration
宣言
- 使用特性的实体内的本身
因为我们不知道你的实体配置,可以验证这个导致通过使用属性的办法内的实体作为一个测试。 如果您使用的是EDMX的实体类将产生的,所以你会想代替这种有结构内的EDMX. (不能真正帮助你因为我不用该死的东西: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映射的实体的问题是,它并不具体,足以独特的识别排。 当EF去更新的一个实体,是检查,并期待更新唯一一列在表中。 这是找到多于一个行将受到影响,因此它失败。
追加的属性 [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发言。
再次注意,如果这个工作和使用EDMX,你会需要审查和修改EDMX映射进行适当的修改,因为这类实体可以再生,失去了你的额外的属性。 (我相信所产生的实体类EDMX有一个评头警告你,这是一个产生类,因此这是一个指标来看。)
更新:
我的主要嫌疑犯,这将是表实际上并没有匹配的PK定义,无论是在运行一个不同的PK组合,或者更可能没有PK给性质的那些领域。 EF可以操作上表中没有PK定义,但是它需要一种关键定义,以确保记录可以唯一标识。 错误你都看到发生时,关键的定义不是唯一的不够的。 (I.e。 如果你正在更新车的1,而选择了一行,具有:
car_number=1,start_day=2021-11-21,return_day=2021-11-22、user_id=0的问题是,多个行具有这种组合的数据库。 如果数据库检查没有多个匹配的行那么你的应用,是几乎可以肯定指向一个不同的数据库比你检查。
事情可以做,以验证这一点:
- 获得运行连串看看如果匹配数据库检查:
在你之前的运行查询,添加以下内容:
// 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,StartDate,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记录具有一个#空ActualReturnDate值,你的钥匙不是唯一的足够的内容,这表。