【发布时间】:2013-11-18 17:27:12
【问题描述】:
我正在尝试更新一个有很多关系的成员,但收到一条错误消息,指出 An entity object cannot be referenced by multiple instances of IEntityChangeTracker。以下是我编写的各种模型和控制器。任何有关如何纠正此问题的建议将不胜感激。
会员模型
public partial class Member
{
NCOWW_DB db = new NCOWW_DB();
public Member()
{
this.Contacts = new HashSet<Contact>();
this.Utilities = new HashSet<Utility>();
}
public int MemberID { get; set; }
[Display(Name = "Member Name")]
[Required]
public string Name { get; set; }
[Display(Name = "Member Number")]
public string Number { get; set; }
[Display(Name = "Mutual Aid Agreement On File")]
public bool MutualAid { get; set; }
[Display(Name = "Type ID")]
public Nullable<int> TypeID { get; set; }
[ForeignKey("TypeID")]
public virtual UtilityType MemberType { get; set; }
[Display(Name = "Water Population")]
public Nullable<int> WaterPopulation { get; set; }
[Display(Name = "Wastewater Population")]
public Nullable<int> WastewaterPopulation { get; set; }
private Address _Address = new Address();
public Address Address { get { return _Address; } set { _Address = value; } }
private Coordinates _Coordinates = new Coordinates();
public Coordinates Coordinates { get { return _Coordinates; } set { _Coordinates = value; } }
[NotMapped]
public double Distance { get; set; }
public bool Deleted { get; set; }
[Display(Name = "Enable Member")]
public bool Enabled { get; set; }
private DateTime _createdOn = DateTime.UtcNow;
public DateTime CreatedOn { get { return _createdOn; } set { _createdOn = value; } }
private DateTime _modifiedOn = DateTime.UtcNow;
public DateTime ModifiedOn { get { return _modifiedOn; } set { _modifiedOn = value; } }
public System.Guid ModifiedBy { get; set; }
//public virtual ICollection<Utility> Contacts { get; set; }
private ICollection<Contact> _Contacts;
public virtual ICollection<Contact> Contacts {
get
{
return (from c in db.Contact
where (c.MemberID == MemberID && c.Deleted == false)
select c).OrderBy(c => c.FirstName).ToList();
}
set
{
_Contacts = value;
}
}
//public virtual ICollection<Utility> Utilities { get; set; }
private ICollection<Utility> _Utilities;
public virtual ICollection<Utility> Utilities
{
get
{
return (from u in db.Utility
where (u.MemberID == MemberID && u.Deleted == false)
select u).OrderBy(u => u.Name).ToList();
}
set
{
_Utilities = value;
}
}
}
效用模型
public partial class Utility
{
NCOWW_DB db = new NCOWW_DB();
public Utility()
{
this.Contacts = new HashSet<Contact>();
this.Resources = new HashSet<UtilityResource>();
}
[Key]
public int UtilityID { get; set; }
[Display(Name="Member")]
[Required]
public int MemberID { get; set; }
[ForeignKey("MemberID")]
public virtual Member Member { get; set; }
[ForeignKey("UtilityID")]
public virtual ICollection<UtilityResource> Resources { get; set; }
[ForeignKey("UtilityID")]
private ICollection<Contact> _Contacts;
public virtual ICollection<Contact> Contacts
{
get
{
return (from c in db.Contact
where (c.MemberID == MemberID && c.Deleted == false)
select c).OrderBy(c => c.FirstName).ToList();
}
set
{
_Contacts = value;
}
}
//public virtual ICollection<Contact> Contacts { get; set; }
[Required]
public string Name { get; set; }
private Address _Address = new Address();
public Address Address { get { return _Address; } set { _Address = value; } }
private Coordinates _Coordinates = new Coordinates();
public Coordinates Coordinates { get { return _Coordinates; } set { _Coordinates = value; } }
[Display(Name = "Utility Type")]
public int? TypeID { get; set; }
[ForeignKey("TypeID")]
[Display(Name = "Utility Type")]
public virtual UtilityType UtilityType { get; set; }
[Display(Name = "Region")]
public int? RegionID { get; set; }
[Display(Name = "County")]
public int? CountyID { get; set; }
private UtilityInfo _WaterInfo = new UtilityInfo();
[Display(Name="Water Information")]
public UtilityInfo WaterInfo { get { return _WaterInfo; } set { _WaterInfo = value; } }
private UtilityInfo _WastewaterInfo = new UtilityInfo();
[Display(Name = "Wastewater Information")]
public UtilityInfo WastewaterInfo { get { return _WastewaterInfo; } set { _WastewaterInfo = value; } }
[NotMapped]
public double Distance { get; set; }
private bool _enabled = true;
public bool Enabled { get { return _enabled; } set { _enabled = value; } }
public bool Deleted { get; set; }
private DateTime _createdOn = DateTime.UtcNow;
public DateTime CreatedOn { get { return _createdOn; } set { _createdOn = value; } }
private DateTime _modifiedOn = DateTime.UtcNow;
public DateTime ModifiedOn { get { return _modifiedOn; } set { _modifiedOn = value; } }
public Guid ModifiedBy { get; set; }
}
联系模特
public partial class Contact
{
public Contact()
{
this.Phones = new HashSet<ContactPhone>();
}
[Key]
public int ContactID { get; set; }
public Nullable<Guid> UserID { get; set; }
[Display(Name = "Member")]
public int MemberID { get; set; }
public Nullable<int> UtilityID { get; set; }
public string Username { get; set; }
[Display(Name = "First Name")]
[Required]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
[Required]
public string LastName { get; set; }
[NotMapped]
public string FullName { get { return FirstName + " " + LastName; } }
[NotMapped]
public string FullNameLastNameFirst { get { return LastName + ", " + FirstName; } }
[Display(Name = "Contact Type")]
public string Type { get; set; }
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")]
[Required]
public string Email { get; set; }
[ForeignKey("ContactID")]
public virtual ICollection<ContactPhone> Phones { get; set; }
[NotMapped]
[Display(Name = "Grant Website Access")]
public bool WebsiteAccess { get; set; }
public bool Deleted { get; set; }
private DateTime _createdOn = DateTime.UtcNow;
public DateTime CreatedOn { get { return _createdOn; } set { _createdOn = value; } }
private DateTime _modifiedOn = DateTime.UtcNow;
public DateTime ModifiedOn { get { return _modifiedOn; } set { _modifiedOn = value; } }
public System.Guid ModifiedBy { get; set; }
public virtual Member Member { get; set; }
public virtual Utility Utility { get; set; }
[NotMapped]
public string Password { get; set; }
[NotMapped]
[Compare("Password")]
[Display(Name = "Confirm Password")]
public string PasswordConfirm { get; set; }
}
public partial class ContactPhone
{
[Key]
public int PhoneID { get; set; }
public int ContactID { get; set; }
public string Number { get; set; }
public string Type { get; set; }
}
成员编辑控制器
private NCOWW_DB db = new NCOWW_DB(); //dbContext
public ActionResult Edit(Member member)
{
try
{
if (ModelState.IsValid)
{
member.ModifiedBy = CurrentUser;
member.ModifiedOn = DateTime.UtcNow;
db.Entry(member).State = EntityState.Modified; <--ERROR OCCURS HERE!
db.SaveChanges();
//RETURN TO DASHBOARD
return RedirectToAction("Index");
}
}
catch (Exception err)
{
/*catch error code*/
}
return View(member);
}
更新
根据下面的答案,我已经修改了我的代码,试图删除错误的NCOWW_DB db = new NCOWW_DB()。但是,这并不能解决问题,因为我不确定如何正确传递dbContext。无论如何,这就是代码当前所在的位置:
更新的成员模型
...
private ICollection<Contact> _Contacts;
public virtual ICollection<Contact> Contacts {
get
{
return MemberFunctions.LoadMemberContacts(MemberID);
}
set
{
_Contacts = value;
}
}
private ICollection<Utility> _Utilities;
public virtual ICollection<Utility> Utilities
{
get
{
return MemberFunctions.LoadMemberUtilities(MemberID);
}
set
{
_Utilities = value;
}
}
}
public static class MemberFunctions
{
public static ICollection<Contact> LoadMemberContacts(int memberID)
{
NCOWW_DB db = new NCOWW_DB();
return (from c in db.Contact
where (c.MemberID == memberID && c.UtilityID == null && c.Deleted == false)
select c).OrderBy(c => c.FirstName).ToList();
}
public static ICollection<Utility> LoadMemberUtilities(int memberID)
{
NCOWW_DB db = new NCOWW_DB();
return (from u in db.Utility
where (u.MemberID == memberID && u.Deleted == false)
select u).OrderBy(u => u.Name).ToList();
}
}
【问题讨论】:
标签: c# asp.net-mvc entity-framework