c# - “NameOfProperty”不能用作实体类型“NameOfType”的属性,因为它被配置为导航
问题描述
我有一个带有 Ship and Reservations 导航属性的 DB 预订和船类,
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' when IDENTITY_INSERT设置为关闭。我想在数据库中创建一个带有船的预订,但我无法插入值。所以我尝试用这个 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");
}
任何想法我错过了什么?
解决方案
修复保留类,删除 [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 中删除所有流畅的 API,因此您不需要它们
并尝试使用此代码添加新项目
public async Task CreateReservation(ReservationGetDTO reservationDTO)
{
_context.Reservations.Add(Mapper.Map(reservationDTO, new Reservation()));
await _context.SaveChangesAsync();
}
推荐阅读
- r - data.table 中的 setnames 确实会正确标记列
- android-studio - Gradle 同步锁
- javascript - 在发送到服务器端之前在客户端散列密码
- java - 在 json 数据中获取换行符转义字符
- android - 无法安全释放相机
- primefaces - 嗨,我有一个带有菜单栏的 JSF 页面。我想在页面顶部显示一条消息,以显示对话框中的操作结果
- json - 将 JSON 数组解析为 Map
使用 Kotlinx.serialization - mongodb-stitch - MongoDB Stitch 自定义新用户电子邮件确认
- uitableview - 使用 UITableView 时发生不需要的 segue
- sql - 在表格中选择“Ratio_to_report”