2015-03-31 1 views
0

В моем приложении ASP.NET Web forms у меня есть Model, у которого ID имеет тип IDENTITY типа int. В моем Insert, после сохранения элемента, я создаю каталог этого itemId & хочу сохранить изображения в нем & Обновить изображение Пути того же в Item. Об обновлении свойств элемента & пытается спасти, он дает мне ошибку: -Обновление нескольких свойств модели после внесения в базу данных

The property 'ChannelId' is part of the object's key information and cannot be modified. 

Мои вставки Методы:

public void InsertItem() 
    { 
     Channel item = null; 
     item = new Channel(); 

     TryUpdateModel(item); 

     if (ModelState.IsValid) 
     {     
      // Save changes 
      // After this line only I can get the ID created by DB 
      _db.SaveChanges(); 
      _db.Channels.Add(item); 
      System.Diagnostics.Debug.WriteLine("### EF ID OF Newly Created CHANNEL = " + item.ChannelId); 

      // Create Folder for the Channel based on its ID 
      string pathToCreate = "~/CRMImages/Channels/" + item.ChannelId; 
      string myFileName = ""; 
      if (!Directory.Exists(Server.MapPath(pathToCreate))) 
      { 
       DirectoryInfo di = Directory.CreateDirectory(Server.MapPath(pathToCreate)); 
       var user = System.Security.Principal.WindowsIdentity.GetCurrent().User; 
       var userName = user.Translate(typeof(System.Security.Principal.NTAccount)); 
       System.Security.AccessControl.DirectorySecurity sec = di.GetAccessControl(); 
       sec.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(userName, 
        System.Security.AccessControl.FileSystemRights.Modify, 
        System.Security.AccessControl.AccessControlType.Allow)); 
       di.SetAccessControl(sec); 

       System.Diagnostics.Debug.WriteLine("CHannel FOLDER CREATED PATH : " + di.FullName); 
       myFileName = pathToCreate + "/pancardImg.png"; 
       System.Diagnostics.Debug.WriteLine("PATH To Save PAN File & NAME : " + myFileName); 

       // PAN CARD IMAGE 
       FileUpload panInsertUpload = InsertChannelId.FindControl("panInsertUpload") as FileUpload; 
       if (panInsertUpload != null) 
       { 
        if (panInsertUpload.HasFile) 
        { 
         System.Diagnostics.Debug.WriteLine("EDIT UNIT PLAN FILE NAME =" + panInsertUpload.FileName); 
         myFileName = pathToCreate + "/pancardImg.png"; 
         panInsertUpload.SaveAs(Server.MapPath(myFileName)); 
         item.PanImageURL = myFileName; 
        } 
       } 

       TryUpdateModel(item); 
       // HERE I GET THE ERROR. HOW TO UPDATE THAT ITEM IN DB 
       _db.SaveChanges(); 
      } 
      Response.Redirect("Default"); 
     } 
    } 

каталог создается, файл сохраняется все собственно, только как обновить свойства в БД. После создания dir & сохранение только файла. Я могу получить путь к файлу для сохранения.

Любая помощь очень ценится. Спасибо.

+1

Что с помощью TryUpdateModel для? –

+0

Да, Правеен, я пробовал, и это сработало. Можете ли вы добавить свой ответ, чтобы я мог отметить его как «Ответ». Благодарю. – Tvd

+0

Добавлен ответ на этот счет. –

ответ

1

В вашем примере вам не нужно использовать TryUpdateModel после установки элемента item.PanImageUrl. Удалите раздел, в котором есть TryUpdateModel.

//TryUpdateModel(item); 
// HERE I GET THE ERROR. HOW TO UPDATE THAT ITEM IN DB 
_db.SaveChanges(); 

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

// Save changes 
// After this line only I can get the ID created by DB 
_db.Channels.Add(item); 
_db.SaveChanges(); 
+0

Praveen, поэтому для каждого обновления этого типа их нет необходимости в TryUpdateModel(). Как обновить отредактированный элемент в DbSet контекста? В другой модели обновления не отражаются в DbSet, возвращаясь к Default.aspx, если я не вручную нажму F5, чтобы обновить страницу. В этой модели я получаю эту проблему в Edit.aspx, и я перенаправляю по умолчанию так же, но это происходит только тогда, когда я редактирую изображения через FileUpload, а не иначе. – Tvd

+1

Второй TryUpdateModel необходимо удалить. Этот метод используется для первоначальной загрузки Entity из контекста Controller. Вы сделали это перед добавлением в БД. После этого вы можете обновить свойства и вызвать SaveChanges напрямую –

+0

Не могли бы вы попросить меня помочь с этим запросом - http://stackoverflow.com/questions/29350069/button-click-in-a-tablecell-never-fires- and-table-исчезает? noredirect = 1 # comment46887378_29350069 Я не могу запустить кнопку «Click», добавленный в таблицу динамически. – Tvd

0

заменить TryUpdateModel на TryValidateModel

public void InsertItem() 
    { 
     Channel item = null; 
     item = new Channel(); 

     TryUpdateModel(item); 

     if (ModelState.IsValid) 
     {     
      // Save changes 
      _db.Channels.Add(item); 
      _db.SaveChanges(); 
      System.Diagnostics.Debug.WriteLine("### EF ID OF Newly Created CHANNEL = " + item.ChannelId); 

      // Create Folder for the Channel based on its ID 
      string pathToCreate = "~/CRMImages/Channels/" + item.ChannelId; 
      string myFileName = ""; 
      if (!Directory.Exists(Server.MapPath(pathToCreate))) 
      { 
       DirectoryInfo di = Directory.CreateDirectory(Server.MapPath(pathToCreate)); 
       var user = System.Security.Principal.WindowsIdentity.GetCurrent().User; 
       var userName = user.Translate(typeof(System.Security.Principal.NTAccount)); 
       System.Security.AccessControl.DirectorySecurity sec = di.GetAccessControl(); 
       sec.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(userName, 
        System.Security.AccessControl.FileSystemRights.Modify, 
        System.Security.AccessControl.AccessControlType.Allow)); 
       di.SetAccessControl(sec); 

       System.Diagnostics.Debug.WriteLine("CHannel FOLDER CREATED PATH : " + di.FullName); 
       myFileName = pathToCreate + "/pancardImg.png"; 
       System.Diagnostics.Debug.WriteLine("PATH To Save PAN File & NAME : " + myFileName); 

       // PAN CARD IMAGE 
       FileUpload panInsertUpload = InsertChannelId.FindControl("panInsertUpload") as FileUpload; 
       if (panInsertUpload != null) 
       { 
        if (panInsertUpload.HasFile) 
        { 
         System.Diagnostics.Debug.WriteLine("EDIT UNIT PLAN FILE NAME =" + panInsertUpload.FileName); 
         myFileName = pathToCreate + "/pancardImg.png"; 
         panInsertUpload.SaveAs(Server.MapPath(myFileName)); 
         item.PanImageURL = myFileName; 
        } 
       } 

       TryValidateModel(item); 
       _db.SaveChanges(); 
      } 
      Response.Redirect("Default"); 
     } 
    } 

еще один рабочий пример кода,

[HttpPost] 

[ValidateAntiForgeryToken] 
public ActionResult Create(Employee employee) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Employees.Add(employee); 
     db.SaveChanges(); 

     int empId = employee.EmployeeID; 
     employee.LName = "abc"; 
     TryValidateModel(employee); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(employee); 
} 
+0

Спасибо Смита. Но в WebForms у меня есть только TryUpdateModel & not TryValidateModel. – Tvd

Смежные вопросы