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) {}
}