我有一个对象管理器,其属性为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)
为什么如此,我该怎么做?
答案 0 :(得分:0)
您的情况下无需附加它。以下行就足够了:
manager.EmailAccount = mapper.Map<EmailAccount>(model.EmailAccount);
尽管,您通过声明EmailAccount
未绑定到上下文而正确,manager
对象却是正确的。通过分配电子邮件帐户,将对其进行跟踪。
如果确实需要将对象附加到上下文,或者想要实现一些向上插入逻辑,请参阅此MSDN page。