Область действия базы данных для многих ко многим 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