2014-01-07 3 views
1

Я пытаюсь обновить только некоторые из полей таблицы. Я создал модель представления с полями, которые необходимо обновить. В таблице есть другие поля, которые не нужно касаться, поэтому они оставлены в модели представления.Частичное обновление с помощью Entity Framework - ASP.NET MVC3 C#

Когда я выполняю SaveChanges(), я получаю сообщение об ошибке, связанной с полем, не включенным в модель представления, не может быть NULL. Поскольку это частичное обновление, я думал, что поля, не включенные в модель представления, должны быть оставлены в покое только в обновлении.

Исключение:

Cannot insert the value NULL into column 'NewClubName', table 'dbo.NewClub'; 
column does not allow nulls. UPDATE fails 

Вот что у меня есть:

//View Model 
    public class FormANewClubTeamViewModel 
    { 
     /****************************************************** 
      Properties for Domain Model "NewClub" 
     *******************************************************/ 
     public int NewClub_Id { get; set; } 

     //District and Division 
     public string District { get; set; } 
     public string Division { get; set; } 

     //Lt Governor 
     public string LtGovMasterCustomerId { get; set; } 
     public string LtGovContact { get; set; } 
     public string LtGovEmail { get; set; } 
     public string LtGovPhone { get; set; } 

     // Club Counselor 
     public string ClubCounselorMasterCustomerId { get; set; } 

     [Display(Name = "Club counselor")] 
     [Required(ErrorMessage = "Club counselor name")] 
     public string ClubCounselorContact { get; set; } 

     [Display(Name = "Club counselor email")] 
     [Required(ErrorMessage = "Club counselor email")] 
     public string ClubCounselorEmail { get; set; } 

     [Display(Name = "Club counselor phone")] 
     [Required(ErrorMessage = "Club counselor phone")] 
     public string ClubCounselorPhone { get; set; } 

     /****************************************************** 
      Properties for Domain Model "NewClubSponsor" 
     *******************************************************/ 
     public List<NewClubSponsor> Sponsors { get; set; } 
    } 


//Controller doing the update 
     if (ModelState.IsValid) 
     { 

      if (model.NewClub_Id > 0) 
      { 
       httpStatus = HttpStatusCode.OK; 

       NewClub newClub = new NewClub 
        { 
         Id = model.NewClub_Id, 
         ClubCounselorMasterCustomerId = model.ClubCounselorMasterCustomerId, 
         ClubCounselorContact = model.ClubCounselorContact, 
         ClubCounselorEmail = model.ClubCounselorEmail, 
         ClubCounselorPhone = model.ClubCounselorPhone, 
         DateUpdated = DateTime.Now 


        }; 

       db.NewClubs.Add(newClub); 
       db.Entry(newClub).State = EntityState.Modified; 

       try 
       { 
        var dbResult = db.SaveChanges() > 0; 

       } 
       catch (SqlException ex) 
       { 
        [...] 
       } 
+0

можно объяснить более и дать сведения об исключении? –

+0

уверен. Я обновил вопрос. Суть его в том, что в таблице есть столбец, который не может быть нулевым. этот столбец не нужно обновлять в этот момент, поэтому я не знаю, почему EF заботится об этом в ОБНОВЛЕНИИ. – Slinky

+0

Когда вы создаете новые сущности, поля, которые вам не нужны, имеют значения по умолчанию (null) и почему они генерируют исключение. –

ответ

5

Проблема здесь состоит в том, что EF не имеет какого-либо значит знать, является ли вы обновляете это особое свойство быть NULL, или не хотите обновлять его вообще.

Насколько я знаю, нет способа сделать такое частичное обновление в EF (если вы не хотите ввести чистый код SQL на свой уровень доступа к данным), пока что. Это означает, что для обновления, чтобы иметь место вам нужно загрузить объект, обновить свои поля, и сохраните изменения:

if (model.NewClub_Id > 0) 
{ 
    httpStatus = HttpStatusCode.OK; 

    NewClub newClub = db.NewClubs.Single(nc => nc.Id == model.NewClub_Id); 

    newClub.ClubCounselorMasterCustomerId = model.ClubCounselorMasterCustomerId; 
    newClub.ClubCounselorContact = model.ClubCounselorContact; 
    newClub.ClubCounselorEmail = model.ClubCounselorEmail; 
    newClub.ClubCounselorPhone = model.ClubCounselorPhone; 
    newClub.DateUpdated = DateTime.Now; 

    try 
    { 
     var dbResult = db.SaveChanges() > 0; 
    } 
    catch (SqlException ex) 
    { 
     [...] 
    } 
} 
+0

Четкое и очень подробное объяснение. Благодаря! – Slinky

0

Частичные обновления возможны EF 4.1+ (Скопировал оригинальную идею из this answer)

Вы можете использовать следующий метод;

public int Update(T entity, params Expression<Func<T, object>>[] properties) 
{ 
    myDataContext.Entry(entity).State = EntityState.Unchanged; 

    foreach (var property in properties) 
    { 
    var propertyName = ExpressionHelper.GetExpressionText(property); 
    myDataContext.Entry(entity).Property(propertyName).IsModified = true; 
    } 

    return myDataContext.SaveChangesWithoutValidation(); 
} 

И использовать как;

Update(YourModel, m=> m.Name); 

или

Update(YourModel, m=> m.Name, m.Address, m.OtherProperty); 
Смежные вопросы