2016-07-19 7 views
0

У меня есть приложение MVC. У меня проблема с методом Edit. Он не отправляется обратно в базу данных. Я добавил точки останова и шаг за шагом по очереди, и значение, похоже, обновляется, но оно не обновляет базу данных. База данных не имеет первичного поля id, но другие поля (имя пользователя, служба, short_plan, role) - это все PK. Идеи?Редактировать не обновляет базу данных

Модель:

[MetadataType(typeof(Department_RolesMetadata))] 
public partial class Department_Roles 
{ 
} 

public class Department_RolesMetadata 
{ 
    [Required] 
    public string username { get; set; } 
    [Required] 
    public string service { get; set; } 
    [Required] 
    public string short_plan { get; set; } 
    [Required] 
    public string role { get; set; } 
} 

Контроллер:

public ActionResult Edit(string username, string service, string sp, string role) 
    { 
     Department_Roles department_roles = db.Department_Roles.Where(dr => dr.username == username && dr.service == service && dr.short_plan == sp && dr.role == role).First(); 
     ViewBag.username = new SelectList(db.Service_Logins, "username", "user_type", department_roles.username); 
     return View(department_roles); 
    } 



    [HttpPost] 
    public ActionResult Edit(Department_Roles department_roles) 
    { 
     if (ModelState.IsValid) 
     { 

      db.Department_Roles.Attach(department_roles); 
      db.Entry(department_roles).State = System.Data.Entity.EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.username = new SelectList(db.Service_Logins, "username", "user_type", department_roles.username); 
     return View(department_roles); 
    } 

Вид:

@model NS.Models.Department_Roles 

@{ 
    ViewBag.Title = "Edit"; 
} 

<h2>Edit</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Department</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.username) 
     </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.username,NS.Models.Department_Roles.GetServiceLogins(),"--Select One--") 
     @Html.ValidationMessageFor(model => model.username) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.service) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.service,NS.Models.Service_Logins.GetUserCompetitionTypes(),"--Select One--") 
     @Html.ValidationMessageFor(model => model.service) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.short_plan) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.short_plan,NS.Models.FeeAuth.GetActiveShortPlans(),"--Select One--") 
     @Html.ValidationMessageFor(model => model.short_plan) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.role) 
    </div> 
    <div class="editor-field"> 
     @Html.DisplayFor(model => model.role) 
     @Html.HiddenFor(model => model.role) 
    </div> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "IndividualIndex", new { username = Model.username }) 
</div> 
+3

Возможный дубликат [Entity Framework 5 Обновление записи] (http://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record) – Luke

+0

Удалось ли вам разобраться в этом ? – Luke

+0

Нет, похоже, что это возможно, потому что все значения в базе данных PK. – user2448412

ответ

0

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

То, что я хотел бы предложить оказывает Id поле в качестве первичного ключа, и если вам нужны столбцы, которые вы выбрали ранее в качестве первичного ключа должен быть уникальным, будет добавить уникальное ограничение к вашей базе данных, которая использует эти столбцы. Таким образом, вы сможете обновлять значения, поскольку они больше не будут значениями PK, и у вас будет уникальное ограничение, чтобы сохранить ваши данные целыми.

Добавить Id значение для вашего Department_Roles класса и изменить свой ПК только использовать это значение:

public class Department_Roles 
{ 
    // New Id value, this will be the primary key 
    public int Id { get; set; } 

    // ... 
} 

Тогда вы можете написать что-то вроде этого, чтобы получить, проверить запись с выбранным Id значение существует, а затем обновить строку:

// Get an entity with all the required PK values 
// In your example this will be the posted Department_Roles object 
var departmentRole = new Department_Roles() { Id = 1 }; 

// Get the existing entry from the database 
var existingDepartmentRole = dbContext.Department_Roles.Find(departmentRole.Id); 

if (existingDepartmentRole == null) 
{ 
    throw new Exception("The existing department role could not be found using the PK values provided"); 
} 
else 
{ 
    // Update the entry that we got out of the database and update the values 
    existingDepartmentRole.username = "bob"; 
    existingDepartmentRole.role = "ProjectManager"; 
    existingDepartmentRole.service = "Management"; 
    existingDepartmentRole.short_plan = "permanant"; 

    // Save the changes 
    dbContext.SaveChanges(); 
} 
+0

Я пробовал модифицировать свой код, но он по-прежнему не обновляет базу данных. db.Department_Roles.Attach (department_roles); var updateRecord = db.Entry (department_roles); updateRecord.Property (u => u.short_plan).IsModified = true; //db.Entry(department_roles).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); – user2448412

+0

Должно быть, это что-то делает, вызывает ли какое-либо сообщение об исключении? – Luke

+2

Пожалуйста, добавьте к этому вопросу дополнительный код :). Если вы прикрепляете его и отмечаете запись как «Модифицированный», вам не нужно отмечать индивидуальное свойство как «IsModified = true». – Luke

1

SQL PRIMARY KEY Ограничить: первичный ключ ограничение однозначно идентифицирует каждую запись в таблице базы данных. Первичные ключи должны содержать УНИКАЛЬНЫЕ значения. Столбец первичного ключа не может содержать значений NULL. Большинство таблиц должны иметь первичный ключ, и каждая таблица может иметь только один первичный ключ. Поэтому, когда вы редактируете свою сущность, вы на самом деле создали новую! Если все четыре поля являются первичными ключами, это составной первичный ключ. У вас нет поля вне составного ключа.

+0

Руслан, я хотел бы извиниться и признать, что вы были на правильном пути с этим. Вы не можете обновить значение первичного ключа с помощью Entity Framework, поскольку оно используется для идентификации строки. – Luke

0

Вы пытались получить старое значение объекта из базы данных и использовать EF dbContext.Entry (oldObject) .CurrentValues.SetValues ​​(updatedValues) и вызвать SaveChnages после этого? Это microsoft article объясняет, как использовать метод.

+0

Я пробовал использовать CurrentValues.SetValues ​​(), но значение все еще не обновлялось. – user2448412

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