Entity Framework Code First, Unit of Work, Репозиторий и общий DbContext - PullRequest
1 голос
/ 10 сентября 2011

Я создаю веб-приложение, используя 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, выскакивает ошибка. Я реализовал «общий» контекст БД, верно?

1 Ответ

1 голос
/ 10 сентября 2011

На основании сообщения об ошибке вам может потребоваться отсоединить объект от одного контекста, чтобы сохранить его в другом. Вы также можете создать новый объект, скопированный с первого (здесь необходима глубокая копия), чтобы сделать это. Существует также дополнительная мысль, необходимая для обработки любых внешних ключей, которые не имеют аналоговых ссылок на объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...