C# 通用存储库中的多个IEntityChangeTracker实例无法引用实体对象

C# 通用存储库中的多个IEntityChangeTracker实例无法引用实体对象,c#,asp.net,generics,entity-framework-6,self-reference,C#,Asp.net,Generics,Entity Framework 6,Self Reference,我在这里使用了一个通用接口和存储库,它是 public interface IGenericRepository<T> where T : class { IQueryable<T> GetAll(); IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); void Add(T entity); void Delete(T entity);

我在这里使用了一个通用接口和存储库,它是

public interface IGenericRepository<T> where T : class {

    IQueryable<T> GetAll();
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Delete(T entity);
    void Edit(T entity);
    void Save();
}

A first chance exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll

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

我甚至在
GenericRepository
上尝试过使用
IDisposable
,但没有运气…任何提示都将非常感谢您的帮助…

我想您可能因为上下文而遇到问题。可能你有两个相同实体的上下文。这可能是因为为每个存储库创建了
上下文。尝试使用
UnitOfWork
,或者只为所有存储库创建一个上下文

我从

然后我更改了每个存储库以接受上下文

public class FooRepository :
    GenericRepository<Foo>, IFooRepository {

    public FooRepository(DbContext context) : base(context) {}
}
公共类存储库:
通用存储库{
公共FooRepository(DbContext上下文):基(上下文){}
}

+是的,我想创建一个
UnitOfWork
,我想要一种注入它的方法来适应我当前的设置…+你提供的链接中使用的库似乎无法应用于我的案例,“Repository.Pattern 3.3.5.1”没有库。NETFramework,Version=v4.5”+我可以使用一些库,如
Autofac
?如果是这样,请提供一些指导。。。
public class Question
    {
        [Key]
        public string QuestionID { get; set; }

        public string QuestionNumber { get; set; }

        public string Message { get; set; }

        public DateTime? DatePosted { get; set; }

        public DateTime? Modified { get; set; }

        public bool HasSubgroups { get; set; }

        public string ApplicationUserId { get; set; }
        [ForeignKey("ApplicationUserId")]
        public virtual ApplicationUser ApplicationUser { get; set; }

        public string PaperID { get; set; }
        [ForeignKey("PaperID")]
        public virtual PaperEntity Paper { get; set; }

        public ICollection<QuestionTag> Tags { get; set; }

        public ICollection<QuestionVote> Votes { get; set; }

        public virtual ICollection<Answer> Answers { get; set; }

        public virtual ICollection<QuestionComment> QuestionComments { get; set; }

        public string ParentQuestionID { get; set; }
        [ForeignKey("ParentQuestionID")]
        public virtual Question QuestionReference { get; set; }
        public virtual ICollection<Question> Questions { get; set; }
    }
dynamic model = modela;

            string q_id = model.QuestionID.ToString();

            var question = q_id.IsNullOrEmpty() ? null : await questionRepository.FindBy(id => id.QuestionID == q_id);

            if (question == null)
            {
                question = new Question
                {
                    QuestionID = Guid.NewGuid().ToString("D"),
                    QuestionNumber = model.ParentQuestionNumber,
                    PaperID = model.PaperID,
                    Message = model.QuestionTitle,
                    ApplicationUserId = userid,
                    DatePosted = DateTime.UtcNow,
                    Tags = new List<QuestionTag>()
                };

                await questionRepository.Add(question); 
            }

            var questionQuestion = new Question
            {
                QuestionID = Guid.NewGuid().ToString("D"),
                ParentQuestionID = question.QuestionID,
                QuestionNumber = model.QuestionNumber,
                PaperID = question.PaperID,
                Message = model.Message,
                ApplicationUserId = userid,
                DatePosted = DateTime.UtcNow,
                Tags = new List<QuestionTag>()

            };

question.Questions = new List<Question>{questionQuestion};

            await questionRepository.Update(question);
            await questionRepository.Save();
_ctx.Entry(entity).State = EntityState.Modified;
A first chance exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll

Additional information: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
public class UnitOfWork : IDisposable
    {
        private DbContext context = new DbContext();
        private FooRepository fooRepository;

        public FooRepository fooRepository
        {
            get
            {

                if (this.fooRepository == null)
                {
                    this.fooRepository = new FooRepository(context);
                }
                return fooRepository;
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
public class FooRepository :
    GenericRepository<Foo>, IFooRepository {

    public FooRepository(DbContext context) : base(context) {}
}