如何解决Blazor应用内删除操作会级联不需要,但是在SQL Server Management Studio中,setDefault可以正常工作需要
我有一个出色的服务器端应用程序,使用最新的EF Core 3.1访问SQL Server Express数据库。
我希望删除操作将从属实体设置回默认的int(1)
。
从属实体通过注释设置如下:
public class Course
{
[Key]
[Display(Name = "Kurzus Azonosító")]
public int Id { get; set; }
//Other properties
[Display(Name = "Típus")]
[DefaultValue(1)]
public int VariantID { get; set; } // <= FK
public Variant Variant { get; set; }
}
我的主要实体设置如下:
public class Variant
{
[Key]
[Display(Name = "Azonosító")]
public int Id { get; set; }
[Required]
[Display(Name = "Név")]
public string Name { get; set; }
public List<Course> Courses { get; set; }
}
由于我具有身份验证/授权,因此我的dbContext设置如下:
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Course> Courses { get; set; }
// Some other properties
public DbSet<Variant> Variants { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().ToTable("Courses");
//Some other entities
modelBuilder.Entity<Variant>().ToTable("Variants");
base.OnModelCreating(modelBuilder);
}
}
并在启动文件中声明:
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure();
})
.EnableDetailedErrors()
.EnableSensitiveDataLogging(Configuration.GetValue<bool>("Logging:EnableSqlParameterLogging"))
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
});
//Other services
services.AddTransient<ICourseService,CourseService>();
services.AddTransient<IVariantService,VariantService>();
添加迁移时,自动设置我的外键:
migrationBuilder.AddForeignKey(
name: "FK_Courses_Variants_VariantID",table: "Courses",column: "VariantID",principalTable: "Variants",principalColumn: "Id",onDelete: ReferentialAction.Cascade);
我可以编辑为:onDelete: ReferentialAction.SetDefault
在Update-Database
之后,我可以在SQL Server Management Studio中验证表设计:
CONSTRAINT [FK_Courses_Variants_VariantID]
FOREIGN KEY ([VariantID]) REFERENCES [dbo].[Variants] ([Id]) ON DELETE SET DEFAULT
在这里出现了一个奇怪的部分:如果执行以下序列,则setDefault可以正常工作:
- 将一个项目添加到主体表中(例如:id = 20)
- 将新项目添加到依赖表,并将VariantID设置为20。
- 从主体表中删除ID = 20的项目
- 检查从属表,VariantID恢复为默认ID = 1。
但是,如果我从Blazor应用程序执行相同的序列,则第3步将级联删除。
主体的CRUD服务:
public interface IVariantService
{
Task<List<Variant>> Get();
Task<Variant> Get(int id);
Task<Variant> Add(Variant variant);
Task<Variant> Update(Variant variant);
Task<bool> Delete(int id);
}
public class VariantService: IVariantService
{
private readonly ApplicationDbContext _context;
public VariantService(ApplicationDbContext context)
{
_context = context;
}
public async Task<List<Variant>> Get()
{
return await _context.Variants
.AsNoTracking()
.ToListAsync();
}
public async Task<Variant> Get(int id)
{
var variant = await _context.Variants.FindAsync(id);
return variant;
}
public async Task<Variant> Add(Variant variant)
{
_context.Variants.Add(variant);
await _context.SaveChangesAsync();
return variant;
}
public async Task<Variant> Update(Variant variant)
{
_context.Entry(variant).State = EntityState.Modified;
await _context.SaveChangesAsync();
return variant;
}
public async Task<bool> Delete(int id)
{
bool isDeleted = false;
var variant = await _context.Variants
.FindAsync(id);
if (variant != null)
{
_context.Remove(variant);
await _context.SaveChangesAsync();
isDeleted = true;
}
return isDeleted;
}
}
此行为的根本原因是什么?
我希望这是一个清晰的解释,感谢您的反馈!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。