"NameOfProperty" 不能用作实体类型 'NameOfType' 上的 属性,因为它被配置为导航
"NameOfProperty" cannot be used as a property on entity type 'NameOfType' because it is configured as a navigation
我有一个预订和一艘船 class 用于具有船舶和预订导航属性的数据库,
public class Reservation {
public Reservation() {
Ship = new Ship();
}
public int Id { get; set; }
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Ship Ship { get; set; }
}
public class Ship {
public int Id { get; set; }
public string Name { get; set; }
public string Port{ get; set; }
public List<Reservation> Reservations { get; set; }
}
DBcontext.cs 文件:
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Reservation>().HasOne(r => r.Ship).WithMany(s => s.Reservations);
modelBuilder.Entity<Reservation>().HasOne(u => u.Person).WithMany(r => r.Reservations);
modelBuilder.Entity<Ship>().HasMany(res => res.Reservations).WithOne(s => s.Ship);
//This line generates the error
modelBuilder.Entity<Reservation>().Property(a => a.Ship).ValueGeneratedNever();
}
public DbSet<Reservation> Reservations { get; set; }
public DbSet<Ship> Ships { get; set; }
}
}
我添加生成错误的这一行和下面的 executeSqlRawAsync 方法的原因是我试图解决这个错误:Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'Ships' 当 IDENTITY_INSERT 设置为 OFF 时。` 我想在数据库中创建一个包含一艘船的预订,但我无法插入值。所以我尝试用这个 ValueGeneragtedNever 方法和 executeRawSql 方法修复它,但它给了我标题中的错误。
public async Task CreateReservation(ReservationGetDTO reservationDTO)
{
await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] ON");
_context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
await _context.SaveChangesAsync();
await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] OFF");
}
知道我错过了什么吗?
修复保留 class ,删除 [DatabaseGenerated(DatabaseGeneratedOption.None)] 和构造函数
public class Reservation {
public int Id { get; set; }
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
public int ShipId { get; set; }
public virtual Ship Ship { get; set; }
}
public class Ship {
public int Id { get; set; }
public string Name { get; set; }
public string Port{ get; set; }
public virtual ICollection<Reservation> Reservations { get; set; }
}
并且因为您使用的是 ef core 5+,所以从 dbcontext 中删除了所有 fluent API,您不需要它们
并尝试使用此代码添加新项目
public async Task CreateReservation(ReservationGetDTO reservationDTO)
{
_context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
await _context.SaveChangesAsync();
}
这不起作用的另一个原因是我试图在按下提交按钮后在客户端向导航 属性 添加值。但是您只能在服务器端为导航 属性 添加值。
我有一个预订和一艘船 class 用于具有船舶和预订导航属性的数据库,
public class Reservation {
public Reservation() {
Ship = new Ship();
}
public int Id { get; set; }
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Ship Ship { get; set; }
}
public class Ship {
public int Id { get; set; }
public string Name { get; set; }
public string Port{ get; set; }
public List<Reservation> Reservations { get; set; }
}
DBcontext.cs 文件:
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Reservation>().HasOne(r => r.Ship).WithMany(s => s.Reservations);
modelBuilder.Entity<Reservation>().HasOne(u => u.Person).WithMany(r => r.Reservations);
modelBuilder.Entity<Ship>().HasMany(res => res.Reservations).WithOne(s => s.Ship);
//This line generates the error
modelBuilder.Entity<Reservation>().Property(a => a.Ship).ValueGeneratedNever();
}
public DbSet<Reservation> Reservations { get; set; }
public DbSet<Ship> Ships { get; set; }
}
}
我添加生成错误的这一行和下面的 executeSqlRawAsync 方法的原因是我试图解决这个错误:Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'Ships' 当 IDENTITY_INSERT 设置为 OFF 时。` 我想在数据库中创建一个包含一艘船的预订,但我无法插入值。所以我尝试用这个 ValueGeneragtedNever 方法和 executeRawSql 方法修复它,但它给了我标题中的错误。
public async Task CreateReservation(ReservationGetDTO reservationDTO)
{
await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] ON");
_context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
await _context.SaveChangesAsync();
await _context.Database.ExecuteSqlRawAsync("SET IDENTITY_INSERT [dbo].[Reservations] OFF");
}
知道我错过了什么吗?
修复保留 class ,删除 [DatabaseGenerated(DatabaseGeneratedOption.None)] 和构造函数
public class Reservation {
public int Id { get; set; }
public DateTime FromDate { get; set; }
public DateTime ToDate { get; set; }
public int ShipId { get; set; }
public virtual Ship Ship { get; set; }
}
public class Ship {
public int Id { get; set; }
public string Name { get; set; }
public string Port{ get; set; }
public virtual ICollection<Reservation> Reservations { get; set; }
}
并且因为您使用的是 ef core 5+,所以从 dbcontext 中删除了所有 fluent API,您不需要它们
并尝试使用此代码添加新项目
public async Task CreateReservation(ReservationGetDTO reservationDTO)
{
_context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
await _context.SaveChangesAsync();
}
这不起作用的另一个原因是我试图在按下提交按钮后在客户端向导航 属性 添加值。但是您只能在服务器端为导航 属性 添加值。