Я создаю веб-приложение, используя EF Code First и ASP.NET MVC. У меня есть следующие типы:
IProblemRepository
EFProblemRepository
ICategoryRepository
EFCategoryRepository
CleanStreets // db context
IUnitOfWork
// etc.
Фрагменты кода:
public interface IUnitOfWork
{
void Save();
}
public class CleanStreets : DbContext, IUnitOfWork
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Point> Points { get; set; }
public DbSet<Rating> Ratings { get; set; }
public DbSet<Picture> Pictures { get; set; }
public DbSet<Problem> Problems { get; set; }
public DbSet<Comment> Comments { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Comments)
.WithRequired(c => c.User)
.HasForeignKey(c => c.UserID)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
public void Save()
{
this.SaveChanges();
}
}
public class EFProblemRepository : IProblemRepository
{
private readonly CleanStreets data;
public EFProblemRepository(CleanStreets data)
{
this.data = data;
}
public void Save(Problem problem)
{
if (problem.ProblemID == 0)
{
data.Problems.Add(problem);
}
data.Save();
}
...
}
Сначала у меня не было UnitOfWork. Я создал новый контекст в каждом хранилище. Но после того, как я захотел сохранить Problem
(Problem
включает Category
), используя метод сохранения, описанный выше, я получил следующую ошибку:
На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker
Я обнаружил в stackoverflow, что проблема связана с моим контекстом базы данных, и было решено создать общий контекст с шаблоном единицы работы. Я пытался сделать это (как вы можете видеть выше), но я все еще получаю ошибку. Каждый раз, когда я хочу сохранить Problem
, выскакивает ошибка. Я реализовал «общий» контекст БД, верно?