EF如何附加实体

时间:2018-08-10 18:58:37

标签: c# entity-framework entity-framework-6 dbcontext

我有一个对象管理器,其属性为EmailAccount,键入EmailAccount:

git commit

以及这些类之间的映射:

public class Manager 
{
    .....
    public virtual EmailAccount EmailAccount { get; set; }
}

public partial class EmailAccount : BaseEntity
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string DisplayName { get; set; }
    ....
    public virtual Manager Manager { get; set; }
}

然后在代码中,我从上下文中获取对象管理器并对其进行更新

public class ManagerMap : EntityTypeConfiguration<Manager>
{
    public ManagerMap()
    {
        this.ToTable("Manager");
        this.HasKey(dp => dp.Id);
        this.Property(p => p.FirstName).IsRequired().HasMaxLength(250);
        this.Property(p => p.LastName).IsRequired().HasMaxLength(250);
        this.Property(p => p.Nickname).HasMaxLength(250);

        this.HasOptional(c => c.EmailAccount)
            .WithRequired(a => a.Manager)
            .Map(m => m.MapKey("ManagerId"));
    }
}

因此,正如我们所看到的,EmailAccount不是从上下文中获取的,而是使用外部对象,但其ID(PK)与上下文中的相同!

然后,在保存更改之前,我尝试将此对象附加到上下文:

var manager = _managerService.GetManager(user.Id);
manager.FirstName = model.FirstName;
manager.LastName = model.LastName;
manager.Nickname = model.Nickname;
manager.EmailAccount = mapper.Map<EmailAccount>(model.EmailAccount);

但我遇到了错误:

  

保存或接受更改失败,因为存在多个实体   类型“ Infrastructure.Asset.Messages.EmailAccount”具有相同的   主键值。确保明确设置的主键值为   

添加

_db.EmailAccounts.Attach(manager.EmailAccount); 调用以下方法:

_managerService.GetManager(user.Id)

为什么如此,我该怎么做?

1 个答案:

答案 0 :(得分:0)

您的情况下无需附加它。以下行就足够了:

manager.EmailAccount = mapper.Map<EmailAccount>(model.EmailAccount);

尽管,您通过声明EmailAccount未绑定到上下文而正确,manager对象却是正确的。通过分配电子邮件帐户,将对其进行跟踪。

如果确实需要将对象附加到上下文,或者想要实现一些向上插入逻辑,请参阅此MSDN page