如何解决SqlException:当IDENTITY_INSERT设置为OFF ASP.NET Core 2.1
在数据库中插入新产品时,出现以下SQL错误消息:
表格:
错误SQL:
我一直在寻找有关它的信息,这是一个SQL错误,可以从Entity Framework中修复该错误,但收效不佳
我涉及的模型如下...
Producto.CS:
public class Producto : IEntity
{
public int Id { get; set; }
[Display(Name = "Nombre")]
[MaxLength(50,ErrorMessage = "El campo {0} solo puede contener {1} caracteres de largo.")]
[Required]
public string Name { get; set; }
[Display(Name = "Descripción")]
[MaxLength(150,ErrorMessage = "El campo {0} solo puede contener {1} caracteres de largo.")]
[Required]
public string Description { get; set; }
[Display(Name = "Precio")]
[DisplayFormat(DataFormatString = "{0:C2}",ApplyFormatInEditMode = false)]
public decimal Price { get; set; }
[Display(Name = "Imagen")]
public string ImageUrl { get; set; }
public User User { get; set; }
public Category Category { get; set; }
}
类别。CS:
public class Category : IEntity
{
public int Id { get; set; }
[Display(Name = "Nombre Categoría")]
[Required (ErrorMessage = "El campo categoría es obligatorio.")]
[MaxLength(30,ErrorMessage = "el campo {0} solo puede contener {1} caracteres de largo.")]
public string Name { get; set; }
}
IEntity.CS:
public interface IEntity
{
int Id { get; set; }
}
为我的产品控制器添加了POST操作。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(ProductoViewModel view)
{
if (ModelState.IsValid)
{
var path = string.Empty;
if (view.ImageFile != null && view.ImageFile.Length > 0)
{
var guid = Guid.NewGuid().ToString();
var file = $"{guid}.jpg";
path = Path.Combine(Directory.GetCurrentDirectory(),"wwwroot\\images\\Productos",file);
using (var stream = new FileStream(path,FileMode.Create))
{
await view.ImageFile.CopyToAsync(stream);
}
path = $"~/images/Productos/{file}";
}
//TRANSFORMO EL PRODUCTO PRODUCTOVIEWMODEL A PRODUCTO
var producto = this.ToProducto(view,path);
//USUARIO CREADOR
producto.User = await userHelper.GetUserByEmailAsync(User.Identity.Name);
//CATEGORIA DEL PRODUCTO
producto.Category = await categoryRepository.GetByIdAsync(view.CategoryId);
await productoRepository.CreateAsync(producto);
//FALTA VALIDAR QUE DEVUELVE (TRUE OR FALSE)
return RedirectToAction(nameof(Index));
}
return View(view);
}
private Producto ToProducto(ProductoViewModel view,string path)
{
return new Producto
{
Id = view.Id,ImageUrl = path,IsAvailabe = view.IsAvailabe,LastSale = view.LastSale,Name = view.Name,Description = view.Description,Price = view.Price,Stock = view.Stock,User = view.User,Category = view.Category
};
}
通过跟踪断点,确保我发送的是有效模型
我正在占用存储库模式,并且在POST操作中,我的系统在以下行崩溃
await productoRepository.CreateAsync(producto);
我附上我的 IProductoRepository.CS:
public interface IProductoRepository : IGenericRepository<Producto>
{
IQueryable GetAllWithCategories();
IQueryable GetAllWithUser();
IEnumerable<SelectListItem> GetComboProductos();
}
GenericRepository.CS:
public class GenericRepository<T> : IGenericRepository<T> where T : class,IEntity
{
private readonly DataContext context;
public GenericRepository(DataContext context)
{
this.context = context;
}
public async Task<T> CreateAsync(T entity)
{
await this.context.Set<T>().AddAsync(entity);
await SaveAllAsync();
return entity;
}
}
这是怎么回事?为什么我不能保存带有各自类别的产品?
我已经在SQL引擎中验证了各种密钥
我将附加我的 DataContext.CS 作为附加信息:
public class DataContext : IdentityDbContext<User>
{
public DbSet<Producto> Productos { get; set; }
public DbSet<Category> Categories { get; set; }
#region Constructor
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
#endregion
//METODO QUE DESHABILITA EL BORRADO EN CASCADA
//Y ELIMINA LOS WARNING AL MIGRAR LA BASE DE DATOS
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//MANTISA DE 18 NUMEROS Y DOS DECIMALES
modelBuilder.Entity<Producto>().Property(p => p.Price).HasColumnType("decimal(18,2)");
//DESHABILITAR EL BORRADO EN CASCADA
var cascadeFKs = modelBuilder.Model
.GetEntityTypes()
.SelectMany(t => t.GetForeignKeys())
.Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade);
foreach (var fk in cascadeFKs)
{
fk.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(modelBuilder);
}
}
}
我尝试将以下DataAnnotations添加到相关的类中:
- [键]
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- [ForeignKey(“ ....”)]
还删除了数据库,我再次尝试了一切
我还验证了我的SQL的身份规范值
我知道这是一个已知的ASP.NET Core错误,但是如何在2.1版中修复它?我忘记了什么吗?对我有帮助吗?
解决方法
public class Category : IEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Nombre Categoría")]
[Required (ErrorMessage = "El campo categoría es obligatorio.")]
[MaxLength(30,ErrorMessage = "el campo {0} solo puede contener {1} caracteres de largo.")]
public string Name { get; set; }
public IList<Producto> Productos { get; set; }
}
public class Producto : IEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Nombre")]
[MaxLength(50,ErrorMessage = "El campo {0} ....")]
[Required]
public string Name { get; set; }
[Display(Name = "Descripción")]
[MaxLength(150,ErrorMessage = "El campo {0} solo puede contener {1}
caracteres de largo.")]
[Required]
public string Description { get; set; }
[Display(Name = "Precio")]
[DisplayFormat(DataFormatString = "{0:C2}",ApplyFormatInEditMode = false)]
public decimal Price { get; set; }
[Display(Name = "Imagen")]
public string ImageUrl { get; set; }
public User User { get; set; }
public int CategoryId { get; set; }
[ForeignKey(nameof(CategoryId))]
public Category Category { get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。