首页 > 解决方案 > 错误:IEntityChangeTracker 的多个实例无法引用实体对象

问题描述

我正在尝试在数据库中添加一个新实体,但在添加时我收到以下错误:

 ERROR : An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

Object 类看起来像这样:

public partial class orders
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public orders()
    {
        this.details = new HashSet<detail>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public decimal id { get; set; }
    public decimal locationID { get; set; }
    public decimal contactID { get; set; }
    public string type { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<detail> details { get; set; }
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()] 
    public virtual contact contact { get; set; }
    public virtual location location { get; set; }
}

locationID并且是指向和表contactID的外键值。两者都引用了其中的一些其他表。locationcontactcontactlocation

我已经设置了contact和的值location。各自idlocationcontact那里的表有

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]选项 和 应该在savechanges()订单表上生成并映射到locationID和中contactID。这些值由 DB 中的触发器生成。

保存数据的代码如下

foreach (DbEntityEntry dbEntityEntry in _db.ChangeTracker.Entries().ToArray())
        {

            if (dbEntityEntry.Entity != null)
            {
                dbEntityEntry.State = System.Data.Entity.EntityState.Detached;
            }
        }                                                               
        _db.Entry(order).State = System.Data.Entity.EntityState.Added;
        _db.orders.Add(order);
        _db.SaveChanges();

我对这一切都很陌生,我可能不了解引用的实体插入是如何工作的。

我也无法在代码端处理 ID 的生成。

你们能帮我解决这个问题吗?预先感谢

标签: c#entity-frameworkentity-framework-6npgsql

解决方案


您使用更改跟踪器是否有任何特定原因?对于一般用途,您应该只使用您的DbContext( _db) 和Additem 然后SaveChanges。从 DbContext 中获取实体后,ChangeTracker 会通过您对实体进行的操作自动执行。

  _db.orders.Add(order);
  _db.SaveChanges();

应该就是这些了,除非还有什么你没有提到的。


推荐阅读