如何删除具有相同id mvc的两个不同表的行

时间:2017-04-23 16:02:24

标签: asp.net-mvc linq asp.net-mvc-4 lambda http-post

我正在做一个项目,在那里我有两个表代理和用户。 user表包含一个名为agentid的外键,它从代理表的id中获取值。所以这里我需要删除代理表中的代理,同时它必须对用户表产生影响,并且必须删除用户表中具有与已删除代理相同ID的行。例如,假设如果我从代理表中删除了代理10,则必须删除id 10中的所有细节,同时还必须删除用户表中的10的agentid。当我只是删除代理表中的代理时,它会生成错误

The DELETE statement conflicted with the REFERENCE constraint

我不知道如何解决我的问题,我的代码是

控制器

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(int id)
{
   AgentMaster agentMaster = await db.AgentMasters.FindAsync(id);
   db.AgentMasters.Remove(agentMaster);
   await db.SaveChangesAsync();
   return RedirectToAction("Index");
}

模型

 public partial class AgentMaster
{
    public AgentMaster()
    {
        this.Users = new HashSet<User>();
    }

    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

的DbContext

 public NewEntities()
        : base("name=NewEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
        modelBuilder.Entity<AgentMaster>()
        .HasOptional(c => c.Users)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
    }

这是我的控制器部分,当我尝试加入表并删除记录时,它总是显示相同的错误。任何人都可以帮我找到解决问题的方法?????

4 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server for Database,则只需打开SQL Management Studio并打开已定义外键关系的列的关系窗口。有一个选项插入和更新规范,展开它,对于删除规则,选择 Cascade 选项。

enter image description here

对于您的方案,在进行这些更改后,如果从agent id表中删除agent,则会自动删除agent id表中此user引用的数据。

答案 1 :(得分:0)

您在asp.net上没有任何活动,但您可以在dbms中的两个表之间的关系上启用Cascade选项。

答案 2 :(得分:0)

您不能直接删除另一个使用外键表引用的表的记录。

您必须显式删除users表的相关行,或者您可以使用ON DELETE CASCADE自动删除users表的行。

答案 3 :(得分:0)

当您的表依赖于您的one to many关系中的另一个表时,会发生此错误 所以在dbcontext

中添加此内容
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<AgentMaster>()
    .HasOptional(c => c.Users)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);
}