【发布时间】:2019-12-20 14:31:15
【问题描述】:
我在 ASP.NET Core 应用程序中使用 Entity Framework Core。我希望能够删除多对多关系表中的连接链接行(其中只有 table1Id 和 table2Id 列链接多对多关系),但我唯一的选择是
1) SetNull(我假设尝试将 TABLE2 上的 table2Id 列设置为 null,因为我无法执行更新数据库,它告诉我原因是因为它无法设置外键 id 列为空)
2) 限制(这是一个创可贴修复,因为它允许我推送,但现在我的用户在删除之前撤消所有关系之前无法删除)
3) 级联(这会尝试删除所有内容,绝对不是我想要的)
似乎不仅仅是“删除关系”选项
我尝试将链接类中的 id 属性设置为可为空(参见代码)
public class PregenProfessionArchetypeModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public ICollection<PregenProfessionArchetype_ParentSkill_LinkModel> TrainedParentSkills { get; set; } = new List<PregenProfessionArchetype_ParentSkill_LinkModel>();
public ICollection<PregenProfessionArchetype_ChildSkill_LinkModel> ChildSkills { get; set; } = new List<PregenProfessionArchetype_ChildSkill_LinkModel>();
public ICollection<PregenProfessionArchetype_Technique_LinkModel> Techniques { get; set; } = new List<PregenProfessionArchetype_Technique_LinkModel>();
public ICollection<PregenProfessionArchetype_Talent_LinkModel> Talents { get; set; } = new List<PregenProfessionArchetype_Talent_LinkModel>();
}
public class PregenProfessionArchetype_ChildSkill_LinkModel
{
public int PregenProfessionArchetypeId { get; set; }
public PregenProfessionArchetypeModel PregenProfessionArchetype { get; set; }
public int ChildSkillId { get; set; }
public ChildSkillModel ChildSkill { get; set; }
}
public class PregenProfessionArchetype_ParentSkill_LinkModel
{
public int? PregenProfessionArchetypeId { get; set; }
public PregenProfessionArchetypeModel PregenProfessionArchetype { get; set; }
public int? ParentSkillId { get; set; }
public ParentSkillModel ParentSkill { get; set; }
}
public class ChildSkillModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int ParentSkillId { get; set; }
[Display(Name = "Parent Skill")]
public ParentSkillModel ParentSkill { get; set; }
public int Cost { get; set; } = 1;
public ICollection<PregenProfessionArchetype_ChildSkill_LinkModel> PregenProfessionArchetypeLink { get; set; } = new List<PregenProfessionArchetype_ChildSkill_LinkModel>();
}
// Application Context File Overwritting (Child is same and left out talent)
builder.Entity<PregenProfessionArchetype_ParentSkill_LinkModel>()
.HasKey(ttp => new { ttp.ParentSkillId, ttp.PregenProfessionArchetypeId });
builder.Entity<PregenProfessionArchetype_ParentSkill_LinkModel>()
.HasOne<PregenProfessionArchetypeModel>(tm => tm.PregenProfessionArchetype)
.WithMany(tpp => tpp.TrainedParentSkills)
.HasForeignKey(tm => tm.PregenProfessionArchetypeId)
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<PregenProfessionArchetype_ParentSkill_LinkModel>()
.HasOne<ParentSkillModel>(tm => tm.ParentSkill)
.WithMany(tmm => tmm.PregenProfessionArchetypeLink)
.HasForeignKey(tm => tm.PregenProfessionArchetypeId)
.OnDelete(DeleteBehavior.Restrict);
我唯一可以推送的时间是设置为受限时。该代码显示了类及其关系的示例
错误信息:SetNull
Failed executing DbCommand (81ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [PregenProfessionArchetype_ParentSkill_LinkModel] ADD CONSTRAINT [FK_PregenProfessionArchetype_ParentSkill_LinkModel_ParentSkillModel_PregenProfessionArchetypeId] FOREIGN KEY ([PregenProfessionArchetypeId]) REFERENCES [ParentSkillModel] ([Id]) ON DELETE SET NULL;
【问题讨论】:
-
那么...你想如何删除它们?只是从父集合中删除它们?试过
var toRemove = dbContext.Set<PregenProfessionArchetype_ChildSkill_LinkModel>().FirstOrDefault(x => ....); dbContext.Remove(toRemove); dbContext.SaveChanges();? -
我只是想一起删除他们的链接。例如,如果我要删除一个父技能并且它有与之关联的 PregenProfessionalArchetypes,那么它只会删除它与 Pregens 而不是 Pregens 本身的链接
标签: asp.net-core-mvc entity-framework-core