2009-10-09 1 views
0

Я создаю очень простую форму загрузки файла MVC asp.net. В настоящее время у меня возникла проблема с созданием нового объекта базы данных, в котором хранится информация о указанном файле.Проблема с связанной сущностью в asp.net MVC создать форму с использованием структуры сущности

Код для метода действия выглядит следующим образом:

[Authorize(Roles = "Admin")] 
    public ActionResult AddFile(Guid? id) 
    { 
     var org = organisationRepository.GetOrganisationByID(id.Value); 
     Quote newFile = new Quote(); 
     newFile.Organisation = org; 
     newFile.QuotedBy = User.Identity.Name; 
     return View("AddFile", newFile); 
    } 

Проблема заключается в том, что значение newFile.Organisation теряется, когда форма размещена обратно. Я полагаю, что на данном этапе EF не дает значения для OrganisationID.

[Authorize(Roles = "Admin")] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AddFile(Quote quote) 
    { 
     //save the file to the FS - nice! 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       foreach (string inputTagName in Request.Files) 
       { 
        HttpPostedFileBase file = Request.Files[inputTagName]; 
        if (file.ContentLength > 0) 
        { 
         string filePath = Path.Combine(HttpContext.Server.MapPath("~/Content/TempOrgFiles/") 
         , Path.GetFileName(file.FileName)); 
         file.SaveAs(filePath); 
         quote.QuoteURL = file.FileName; 
        } 
       } 
       surveyRepository.AddQuote(quote); 
       surveyRepository.Save(); 
      } 
      catch (Exception ex) 
      { 
       //add model state errors 
       ViewData["error"] = ex.Message; 
      } 
     } 

     return View("AddFile"); 
    } 

Если бы это было Linq к SQL я бы simplt установить OrganisationID, но с ним быть EF, что не представляется возможным (по крайней мере, с моей установке)

Любые идеи, как лучший способ справиться с этими ситуациями ? (За исключение делает что-то сумасшедшее, как установку скрытого поля формы в organisaionid и установить его в методе POST)

ответ

1

Вы можете хранить OrganisationID в сессии

[Authorize(Roles = "Admin")]
public ActionResult AddFile(Guid? id)
{
Session["OrganisationID"] = id;
}

, а затем установить EntityKey что-то вроде:

quote.OrganisationReference.EntityKey = new EntityKey("ContainerName.OrganizationSet","ID",Session["OrganisationID"])

Если у вас есть организации ID в URL, Вы можете изменить пост функцию:

[AcceptVerbs (HttpVerbs.Post)]
Публичный ActionResult AddFile (цитата цитата, Guid? id)

и получить его автоматически (с соответствующей маршрутизацией).

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

+0

захват идентификатора организации в сообщении, похоже, сработал - но привел к новой новой ошибке. Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker. – Sergio

+0

Является ли этот код всем, что вы делаете в почте? Это происходит, когда вы пытаетесь подключить объекты из разных контекстов. – LukLed

+0

Yep - связанные методы хранилища следующие: public void AddQuote (Quote q) { db.AddToQuotes (q); } public void Save() { db.SaveChanges(); } Я полагаю, что, возможно, когда я назначу quote.Organisation для org, цитата привязана и отслеживается через этот предметный контекст? Затем, когда я пытаюсь добавить к db через другой контекст, все запутывается и исключается ... – Sergio

0

Данные теряются, так как это без гражданства. Ваш объект кавычки в GET - это не тот же объект кавычки, который передан в POST. Это лишь частично гидратируется из-за нативного связывания в MVC (по именам свойств). Вам понадобится setup a CustomModelBinder или запрос на ваш объект Quote в контроллере.