C# 在多对多更新期间未清除联接表中的现有行
最简单的说,当我尝试从POST数据更新我的对象时,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
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没有定义。我觉得我错过了一些基本的东西。