Структура сущностей многие ко многим связаны узким местом при вставке данных - PullRequest
1 голос
/ 24 февраля 2011

У меня есть представление, которое показывает пользователю форму, и пользователь должен загрузить файл и выбрать все категории, связанные с ним.

контроллер, отвечающий за предоставление данных, должен

  • получить информацию о файле и вставить данные в категорию файлов

  • получить идентификаторы связанных категорий и вставьте их также в таблицу что абстрагируется от EF просто вставьте файл и идентификаторы категории.

это моя проблема, контроллер просто получает некоторую информацию о категории, а не все. в основном для вставки нужны только идентификаторы

я не могу использовать

        [HttpPost]
    public ActionResult SaveFile(File file, List<Category> Checkbox, HttpPostedFileBase FileUpload)
    {
        //some stuff
        //for example got the first category and named it to category1
        file.Categories.Add(category1)
    }

Я спросил кого-то, и он сказал, что вы должны выбрать категорию, которую хотите вставить

действительно ли это необходимо? мне нужен только идентификатор категории и идентификатор файла, чтобы сделать вставку, почему я должен выполнить еще один запрос к базе данных, который мне действительно не нужен

Entities


я использую

  • EF 4
  • MVC 3

1 Ответ

2 голосов
/ 24 февраля 2011

Лучше сначала выбрать категорию, потому что это избавит вас от множества возможных проблем, но это не обязательно.Вы можете использовать фиктивный объект категории:

  var category = new Category { Id = receivedId };
  file.Categories.Add(category);

Вы создадите только новую категорию и установите ее PK.Теперь вам нужно обработать вставку файла, где вы должны явно указать ObjectContext для вставки только файла (поскольку ваши категории существуют в базе данных):

context.Files.Attach(file); // now whole object graph is attached but marked as Unchanged
context.ObjectStateManager.ChangeObjectState(file, EntityState.Added); // mark only file entity as inserted
context.SaveChanges();

Вы также можете выбрать противоположное направление:

context.Files.AddObject(file); // all objects in object graph are marked for insertion
foreach (var category in file.Categories)
{
  // you don't want to insert categories again
  context.ObjectStateManager.ChangeObjectState(category, EntityState.Unchanged); 
}
context.SaveChanges();

Этот сценарий работает, если вы знаете, что все категории существуют в вашей базе данных.Если вы хотите вставить новые категории вместе с сохранением файла, вам нужно сначала запросить категории или добавить некоторую информацию о том, какая категория является новой, а какая существует.

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