我将数据更新到数据库时遇到问题。当我想更新数据时,Entitiy Framework会向可以有多行的表(具有外键的表)添加新行。
数据库模型:
当我更新电话/联系人或标签实体时,实体框架会自动添加新行而不是更新它
以下是我使用的代码:
public string UpdateContact(Contact contact)
{
if (contact != null)
{
int id = Convert.ToInt32(contact.id);
Contact Updatecontact = db.Contacts.Where(a => a.id == id).FirstOrDefault();
Updatecontact.firstname = contact.firstname;
Updatecontact.lastname = contact.lastname;
Updatecontact.address = contact.address;
Updatecontact.bookmarked = contact.bookmarked;
Updatecontact.city = contact.city;
Updatecontact.notes = contact.notes;
Updatecontact.Emails1 = contact.Emails1;
Updatecontact.Phones1 = contact.Phones1;
Updatecontact.Tags1 = contact.Tags1;
db.SaveChanges();
return "Contact Updated";
}
else
{
return "Invalid Record";
}
}
编辑:
这是EF模型代码:
联系人:
public partial class Contact
{
public Contact()
{
this.Emails1 = new HashSet<Email>();
this.Phones1 = new HashSet<Phone>();
this.Tags1 = new HashSet<Tag>();
}
public int id { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
public string address { get; set; }
public string city { get; set; }
public Nullable<byte> bookmarked { get; set; }
public string notes { get; set; }
public virtual ICollection<Email> Emails1 { get; set; }
public virtual ICollection<Phone> Phones1 { get; set; }
public virtual ICollection<Tag> Tags1 { get; set; }
}
电子邮件/标签和手机具有相同的型号(价值名称不同)
public partial class Email
{
public int id { get; set; }
public int id_contact { get; set; }
public string email1 { get; set; }
public virtual Contact Contact1 { get; set; }
}
答案 0 :(得分:5)
更新属性而不是设置新对象。
Updatecontact.Emails1.email1 = contact.Emails1.email1;
Updatecontact.Phones1.number = contact.Phones1.number;
Updatecontact.Tags1.tag1 = contact.Tags1.tag1;
修改:您的联系人模式似乎有列表的电子邮件,手机和标签。如果是这样,那么简单的分配将不起作用。相反,当从客户端发送时,您必须逐个查找并更新:
foreach ( var email in contact.Emails1 )
{
// first make sure the object is retrieved from the database
var updateemail = Updatecontact.Emails1.FirstOrDefault( e => e.id == email.id );
// then update its properties
updateemail.email1 = email.email1;
}
// do the same for phones and tags
答案 1 :(得分:1)
这样做是因为您将不同的HashSet
值设置为完全不同的集合的值,即您在该方法中调用contact
的值。为了让您正确地进行更新,您将不得不遍历电子邮件,电话和标签,以检查是否需要在您尝试更新的实际对象上添加/更新/删除这些内容。
答案 2 :(得分:1)
首先,如果您已经通过参数接收了联系人,为什么还要搜索联系人?这使得您认为您创建了一个新的,因为您处于不同的上下文中,如果是这样,那么它会创建一个新记录,因为您在2个不同的上下文中有2个不同的对象。
尝试在同一个上下文中只使用一个对象进行更新,EF应该将对象标记为自行修改,否则请在保存之前尝试确保您的对象具有EntityState.Modified。