无法首先使用 EF Core 代码将 "subclass" 对象插入数据库
Cannot insert "subclass" object into database using EF Core code first
我有两个类:
Workout.cs:
public class Workout
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<WorkoutSet> Sets { get; set; }
public DateTimeOffset FromDateTime { get; set; }
public DateTimeOffset ToDateTime { get; set; }
}
我有子类
WorkoutSet.cs
public class WorkoutSet
{
public int Id { get; set; }
public int WorkoutId { get; set; }
public Workout Workout { get; set; }
public int OrderNumber { get; set; }
public int Type { get; set; }
public int Duration { get; set; }
}
此设置使 WorkoutSet 具有指向 Workout 的外键。这很好,但我在将数据插入数据库时遇到问题。我正在尝试使用以下代码插入带有新锻炼集的新锻炼(如锻炼的定义):
using (IDbContextTransaction transaction = await _dbContext.Database.BeginTransactionAsync())
{
try
{
await _dbContext.Workouts.AddAsync(data);
await _dbContext.SaveChangesAsync();
await _dbContext.WorkoutSets.AddRangeAsync(data.Sets);
await _dbContext.SaveChangesAsync();
await transaction.CommitAsync();
return data;
}
catch (Exception e)
{
await transaction.RollbackAsync();
throw new Exception("Cannot create workout");
}
}
当我调试应用程序时,我看到为锻炼创建了正确的 ID,我看到为每个锻炼集创建了正确的新生成的 ID,但是在锻炼集之后,当我调用 savechangesasync 时,我收到错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert
explicit value for identity column in table 'WorkoutSets' when
IDENTITY_INSERT is set to OFF.
我的数据库上下文如下所示:
public class TrainingDbContext : DbContext
{
public TrainingDbContext(DbContextOptions<TrainingDbContext> options) : base (options)
{
}
public DbSet<Workout> Workouts { get; set; }
public DbSet<WorkoutSet> WorkoutSets { get; set; }
}
我正在研究在网上找到的不同解决方案,例如将这样的属性添加到 ID 中:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
或重写 WorkoutSet 实体的 OnModelCreating 但没有成功。我找到的每个解决方案都无法解决我的问题。我知道问题出在 EF Core 中,但我不是 100% 确定如何解决它。
Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'WorkoutSets' when IDENTITY_INSERT is set to OFF.
您似乎正在为身份列 Id 插入值。
Workout
和WorkoutSet
中的Id属性可以尽量不赋值,使其自增
我有两个类:
Workout.cs:
public class Workout
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<WorkoutSet> Sets { get; set; }
public DateTimeOffset FromDateTime { get; set; }
public DateTimeOffset ToDateTime { get; set; }
}
我有子类
WorkoutSet.cs
public class WorkoutSet
{
public int Id { get; set; }
public int WorkoutId { get; set; }
public Workout Workout { get; set; }
public int OrderNumber { get; set; }
public int Type { get; set; }
public int Duration { get; set; }
}
此设置使 WorkoutSet 具有指向 Workout 的外键。这很好,但我在将数据插入数据库时遇到问题。我正在尝试使用以下代码插入带有新锻炼集的新锻炼(如锻炼的定义):
using (IDbContextTransaction transaction = await _dbContext.Database.BeginTransactionAsync())
{
try
{
await _dbContext.Workouts.AddAsync(data);
await _dbContext.SaveChangesAsync();
await _dbContext.WorkoutSets.AddRangeAsync(data.Sets);
await _dbContext.SaveChangesAsync();
await transaction.CommitAsync();
return data;
}
catch (Exception e)
{
await transaction.RollbackAsync();
throw new Exception("Cannot create workout");
}
}
当我调试应用程序时,我看到为锻炼创建了正确的 ID,我看到为每个锻炼集创建了正确的新生成的 ID,但是在锻炼集之后,当我调用 savechangesasync 时,我收到错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'WorkoutSets' when IDENTITY_INSERT is set to OFF.
我的数据库上下文如下所示:
public class TrainingDbContext : DbContext
{
public TrainingDbContext(DbContextOptions<TrainingDbContext> options) : base (options)
{
}
public DbSet<Workout> Workouts { get; set; }
public DbSet<WorkoutSet> WorkoutSets { get; set; }
}
我正在研究在网上找到的不同解决方案,例如将这样的属性添加到 ID 中:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
或重写 WorkoutSet 实体的 OnModelCreating 但没有成功。我找到的每个解决方案都无法解决我的问题。我知道问题出在 EF Core 中,但我不是 100% 确定如何解决它。
Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'WorkoutSets' when IDENTITY_INSERT is set to OFF.
您似乎正在为身份列 Id 插入值。
Workout
和WorkoutSet
中的Id属性可以尽量不赋值,使其自增