StefanIvovic Ответов: 0

Область действия базы данных для многих ко многим ASP.NET


У меня есть проблема с отношениями "многие ко многим". я реализовал шаблон GenericRepository и UnitOfWork.

у меня есть 2 сущности, тест и вопрос

проблема в том, что когда я вызываю эти 2 сущности из базы данных и хочу связать их в таблице ссылок, ef дублируется затем в их соответствующих таблицах. Я считаю, что это можно решить с помощью оператора(var context = new MyDbContext()) и связывания их внутри этого оператора using, но, к сожалению, UnitOfWork этого не допускает, поэтому я попытался использовать (var scope = new TransactionScope()) безрезультатно.

например: у меня есть 5 вопросов в базе данных и 3 ответа на каждый вопрос, и после того, как пользователь закончит тест, я вычисляю оценку пользователя и вставляю новую тестовую строку с некоторыми данными. таблица ссылок находится здесь, чтобы показать, какие вопросы были у пользователя для этого теста. когда я сохраняю тестовую сущность, каждый отдельный вопрос и ответ дублируются в базу данных.

public int SaveTestResult(TestEntity testEntity)
    {
        using (var scope = new TransactionScope() )
        {

            testEntity.Questions = testEntity.Questions.OrderBy(q => q.Id).ToList();
            var idlist = testEntity.Questions.Select(x => x.Id).ToList(); // get ids from list of questions from testentity

            //note:i believe this line is causing that behaviour 
            var questionss = _unitOfWork.QuestionRepository.GetMany(q => idlist.Contains(q.Id)).OrderBy(q => q.Id).ToList();//get questions from ids and sort them by id  
            var questions = AutoMapper.Mapper.Map<List<Question>, List<QuestionEntity>>(questionss); //map from Question from db to QuestionEntity
            testEntity.Questions = testEntity.Questions.OrderBy(q => q.Id).ToList();//sort testEtities questions id to match questions above
            var number= 0;
            for (int i = 0; i < testEntity.Questions.Count; i++)
            {
                for (int j = 0; j < testEntity.Questions[i].Answers.Count; j++)
                {
                    if ((testEntity.Questions[i].Answers[j].IsTrueUserChoice == questions[i].Answers[j].IsTrue) && (questions[i].Answers[j].IsTrue == true))
                        number++;
                }
            }

            testEntity.TestScore = number;
            testEntity.Questions = questions;//ading questions from db so model validation would pass. quesiton from testEntiy are not valid, some properties are missing
            var testDb = new Test();
            testDb.TestTime = (testDb.TestDateEnd - testEntity.TestDateStart).Value;
            testDb.TestDateStart = testEntity.TestDateStart.Value;
            testDb.TestScore = testEntity.TestScore;
            testDb.UserId = testEntity.UserId;
            testDb.Questions = AutoMapper.Mapper.Map<List<QuestionEntity>, List<Question>>(testEntity.Questions);
            _unitOfWork.TestRepository.Insert(testDb);
            _unitOfWork.Save();
            scope.Complete();
            return number;
        }
    }

примечание: не увлекайтесь логикой, которую я реализовал :) сосредоточьтесь на проблеме спасибо

Что я уже пробовал:

каждое решение на stackoverflow

F-ES Sitecore

Не уверен, что я действительно понимаю этот вопрос, но обычно это происходит, когда вы создаете новую сущность, но не присоединяете ее к dbcontext и не даете EF знать, что сущность уже существует, поэтому, когда вы обновляете контекст, EF думает, что он новый, и создает его. Таким образом, вы, вероятно, создаете новые экземпляры своей сущности вопроса (через AutoMapper?) не сообщая EF, эти сущности отражают существующие сущности и не являются новыми.

Прочтите о присоединении сущностей к контексту здесь

https://msdn.microsoft.com/en-us/library/jj592676(v=против 113).aspx

StefanIvovic

право, у являются правильными. я знаю, что делаю именно это. но как я могу прикрепить отслеживаемую сущность с репозиторием и шаблоном UnitOfWork? как вы можете видеть в коде у меня нет классического dbcontext у меня есть unitOfWork

0 Ответов