【问题标题】:Entity Framework POCO SaveChanges() on Update doesn't work?更新时的实体框架 POCO SaveChanges() 不起作用?
【发布时间】:2011-05-03 18:30:54
【问题描述】:

我正在使用 EF CTP 4,使用 POCO 模型,添加新对象并调用 SaveChanges() 有效,但更新对象不起作用。更新代码如下:

public void UpdateContact(Contact contact)
        {
            var findContact = GetContact(contact.ContactID);
            findContact = contact;
            _context.SaveChanges();
        }

public Contact GetContact(int contactId)
        {
            return GetAllContacts().SingleOrDefault(c => c.ContactID == contactId);
        }

public IQueryable<Contact> GetAllContacts()
        {
            return _context.Contacts;
        }

我不确定我在这里做错了什么。任何想法?谢谢。

【问题讨论】:

    标签: entity-framework entity-framework-4 poco


    【解决方案1】:

    问题在于,当您分配 findContact = contact 时,EntityState 不会在 ObjectStateManager 中更改(因此仍设置为 Unchanged)。因此,不会为实体生成任何Update SQL 语句。您有多种选择来进行更新:

    选项 1: 逐个字段填充 findContact

    var findContact = GetContact(contact.ContactID);
    findContact.FirstName = contact.FirstName;
    findContact.LastName = contact.LastName;
    ...
    _context.SaveChanges();
    

    选项2:使用ApplyCurrentValues方法:

    var findContact = GetContact(contact.ContactID);
    _context.ApplyCurrentValues("Contacts", contact);
    _context.SaveChanges();
    

    选项 3: 附加更新的实体并更改 ObjectStateManager 中的状态。 (注意:这不会往返于数据库以获取现有联系人)。

    _context.AttachTo("Contacts", contact);
    var contactEntry = Context.ObjectStateManager.GetObjectStateEntry(contact);
    contactEntry.ChangeState(EntityState.Modified);
    _context.SaveChanges();
    

    【讨论】:

    • 嗨 Yakimych,使用 选项 1,我可以使用 AutoMapper 在 findContact 和联系人之间进行映射,而不是映射每个属性吗?谢谢。
    • @Saxman - 尽管AutoMapper 通常用于映射不同类型的对象,但您可以尝试在映射的两侧使用相同的类型。我自己没用过,你可以试试。请在解决问题后发布更新 - 它可能对将来的参考有用。
    • 由于某种原因,我无法使用我的上下文调用方法 ApplyCurrentValues(),因此排除了选项 2。我没有尝试选项 3。AutoMapper 在这种情况下不起作用,我必须手动设置 findContact 的属性等于联系。谢谢!
    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多