Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多对多更新期间未清除联接表中的现有行_C#_Asp.net_Asp.net Mvc_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 在多对多更新期间未清除联接表中的现有行

C# 在多对多更新期间未清除联接表中的现有行,c#,asp.net,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 6,最简单的说,当我尝试从POST数据更新我的对象时,Activities,关系Activities的现有多对多联接数据。在SaveChanges期间,联系人不会从MSSQL数据库中删除。如果POST数据中已存在该活动的某个联系人,则会导致错误 违反主键约束“PK_tblActionContact”。无法在对象“dbo.tblActionContact”中插入重复密钥。重复的键值为(1,94) 我的控制器: public ActionResult Edit(Activity activity

最简单的说,当我尝试从POST数据更新我的对象时,
Activities
,关系
Activities的现有多对多联接数据。在
SaveChanges
期间,联系人不会从MSSQL数据库中删除。如果POST数据中已存在该活动的某个联系人,则会导致错误

违反主键约束“PK_tblActionContact”。无法在对象“dbo.tblActionContact”中插入重复密钥。重复的键值为(1,94)

我的控制器:

    public ActionResult Edit(Activity activity)
    {
        if (ModelState.IsValid)
        {
            //save the activity
            activity.Contact.Clear(); //Clear the existing contacts
            db.Entry(activity).State = EntityState.Modified;

            //then add each contact
            foreach (int contactId in activity.SelectedContactIds)
            {
                activity.Contact.Add(db.tblContact.Find(contactId));
            }

            db.SaveChanges();
            TempData["Flash Success"] = "Activity Saved";
            return RedirectToAction("Index", "Home");
        }

        return View(activity);
    }
我尝试了这么多不同的变化,基于对这个优秀网站的大量搜索,但我没有发现任何将工作

我对
activity.Contact.Clear()
寄予厚望,这确实会从对象中的活动中清除现有联系人,但不会从实际的MSSQL表中清除它们

如果我选择了在现有的
活动中未选择的新联系人
,则它会很好地保存,当然包括在创建新的
活动

请,我是新的张贴在这里,所以请让我知道如果更多的代码或信息是必要的

编辑 我正在发布我的背景和适用模型:

背景:

public partial class SalesEntities : DbContext
{
    public SalesEntities()
        : base("name=SalesEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<SalesAccount> tblAccount { get; set; }
    public virtual DbSet<Activity> tblAction { get; set; }
    public virtual DbSet<ActionTypeLookup> tblActionTypeLookup { get; set; }
    public virtual DbSet<Campaign> tblCampaign { get; set; }
    public virtual DbSet<Contact> tblContact { get; set; }
    public virtual DbSet<GenericLookup> tblGenericLookup { get; set; }
    public virtual DbSet<MarketingLetter> tblMarketingLetter { get; set; }
    public virtual DbSet<Opportunity> tblOpportunity { get; set; }
    public virtual DbSet<Product> tblProduct { get; set; }
    public virtual DbSet<Source> tblSource { get; set; }
    public virtual DbSet<VerifiedAccount> tblVerifiedAccount { get; set; }
    public virtual DbSet<AspNetUsers> AspNetUsers { get; set; }
}
}
公共部分类SalesEntities:DbContext
{
公共销售实体()
:base(“名称=销售实体”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟DbSet tblAccount{get;set;}
公共虚拟数据库集tblAction{get;set;}
公共虚拟数据库集tblActionTypeLookup{get;set;}
公共虚拟DbSet tblCampaign{get;set;}
公共虚拟数据库集tblContact{get;set;}
公共虚拟数据库集tblGenericLookup{get;set;}
公共虚拟数据库集tblMarketingLetter{get;set;}
公共虚拟数据库集tblOpportunity{get;set;}
公共虚拟DbSet tblProduct{get;set;}
公共虚拟数据库集tblSource{get;set;}
公共虚拟DbSet tblVerifiedAccount{get;set;}
公共虚拟数据库集AspNetUsers{get;set;}
}
}
活动模型:

namespace SalesTracker.Models
{
using System;
using System.Collections.Generic;

public partial class Activity
{
    public Activity()
    {
        this.Contact = new HashSet<Contact>();
    }

    public int ActionId { get; set; }
    public int AccountId { get; set; }
    public int CampaignId { get; set; }
    public string SalespersonId { get; set; }
    public int ActionTypeId { get; set; }
    public string Note { get; set; }
    public Nullable<System.DateTime> ActionDate { get; set; }
    public string NextStep { get; set; }
    public string Duration { get; set; }
    public Nullable<int> MarketingLetterId { get; set; }
    public string EditedBy { get; set; }
    public bool Active { get; set; }
    public System.DateTime EditDate { get; set; }
    public bool Completed { get; set; }

    public virtual SalesAccount SalesAccount { get; set; }
    public virtual ActionTypeLookup ActionTypeLookup { get; set; }
    public virtual Campaign Campaign { get; set; }
    public virtual MarketingLetter MarketingLetter { get; set; }
    public virtual ICollection<Contact> Contact { get; set; }
    public virtual AspNetUsers AspNetUsers { get; set; }
    public virtual AspNetUsers AspNetUsersEditedBy { get; set; }
}
}
名称空间SalesTracker.Models
{
使用制度;
使用System.Collections.Generic;
公共部分班级活动
{
公共活动()
{
this.Contact=new HashSet();
}
public int ActionId{get;set;}
public int AccountId{get;set;}
公共ID{get;set;}
公共字符串salersonid{get;set;}
public int ActionTypeId{get;set;}
公共字符串注释{get;set;}
公共可为空的ActionDate{get;set;}
公共字符串NextStep{get;set;}
公共字符串持续时间{get;set;}
可为空的公共标识符{get;set;}
由{get;set;}编辑的公共字符串
公共bool活动{get;set;}
public System.DateTime EditDate{get;set;}
公共bool已完成{get;set;}
公共虚拟SalesAccount SalesAccount{get;set;}
公共虚拟ActionTypeLookup ActionTypeLookup{get;set;}
公共虚拟活动活动{get;set;}
公共虚拟MarketingLetter MarketingLetter{get;set;}
公共虚拟ICollection联系人{get;set;}
公共虚拟AspNetUsers AspNetUsers{get;set;}
公共虚拟AspNetUsers AspNetUsersEditedBy{get;set;}
}
}
以及接触模型

namespace SalesTracker.Models
{
using System;
using System.Collections.Generic;

public partial class Contact
{
    public Contact()
    {
        this.Activity = new HashSet<Activity>();
    }

    public int ContactId { get; set; }
    public int AccountId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Title { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string Note { get; set; }
    public System.DateTime VerifiedDate { get; set; }
    public string VerifiedBy { get; set; }
    public int VerificationStatus { get; set; }
    public System.DateTime EditDate { get; set; }
    public string EditedBy { get; set; }
    public bool Active { get; set; }

    public virtual SalesAccount SalesAccount { get; set; }
    public virtual ICollection<Activity> Activity { get; set; }
    }
}
名称空间SalesTracker.Models
{
使用制度;
使用System.Collections.Generic;
公共部分类接触
{
公众联络()
{
this.Activity=newhashset();
}
public int ContactId{get;set;}
public int AccountId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串标题{get;set;}
公用字符串电话{get;set;}
公共字符串电子邮件{get;set;}
公共字符串注释{get;set;}
public System.DateTime验证日期{get;set;}
由{get;set;}验证的公共字符串
公共int验证状态{get;set;}
public System.DateTime EditDate{get;set;}
由{get;set;}编辑的公共字符串
公共bool活动{get;set;}
公共虚拟SalesAccount SalesAccount{get;set;}
公共虚拟ICollection活动{get;set;}
}
}

我想你被
Clear()
的目的弄糊涂了。它所做的只是删除父对象及其子对象之间的引用,实际上并不删除实体。您需要执行以下操作才能实际删除它们:

activity.Contact.ToList().ForEach(c => db.Contact.DeleteObject(c));

当然,后面是您的
db.SaveChanges()

有意义。当我在上面的编辑方法中实现此功能时,Visual Studio声称db(SalesTracker.Models.SalesEntities)不包含“Contact”的定义,即使我有一个Contact的模型并且添加它们没有问题。我首先使用数据。我应该把我的模型类发布为上面的编辑吗?我正在努力开始使用c#和MVC…当我使用
activity.Contact.ToList().ForEach(c=>db.tblContact.DeleteObject(c))(tblContact有一个定义,而不是Contact),然后它说DeleteObject没有定义。我觉得我错过了一些基本的东西。