0

Utilisation de MVC 2 J'ai essayé de réaliser ce projet de magasin d'enregistrements. La création d'enregistrements fonctionne mais pas la mise à jour. Aucune exception n'est levée non plus.LINQ to SQL ne met pas à jour les enregistrements de base de données dans l'application MVC 2

J'ai examiné getchangeset() juste avant submitchanges() il montre tous les zéros.

Merci pour votre lecture et vous aider :)

La vue Edit:

<% using (Html.BeginForm("Edit", "Song")) { %> 
    <fieldset>   
      <%: Html.HiddenFor(model => model.SongID) %> 
      <%: Html.HiddenFor(model => model.DownloadCount) %> 
      <%: Html.HiddenFor(model => model.Rating) %> 
      <%: Html.HiddenFor(model => model.TagMapID) %> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.AlbumID) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.DropDownListFor(model => model.AlbumID, DataHelper.getAlbumList(Model.AlbumID)) %> 
      <%= Html.ValidationMessageFor(model => model.AlbumID) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.FullName) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.FullName)%> 
      <%= Html.ValidationMessageFor(model => model.FullName) %> 
and so on... 

Modifier la fonction

public ActionResult Edit(int id) 
    { 
     try 
     { 
      var model = songRepository.Song.Single(rec => rec.SongID == id); 

      return View(model); 
     } 
     catch (Exception anyEx) 
     { 
      throw anyEx; 
      //return View("Error") 
     } 
    } 

Modifier le message fonction

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(Song model) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       songRepository.SaveSong(model); 
       TempData["adminmsg"] = "Song saved"; 
       return RedirectToAction("List", "Song"); 
      } 
      else 
      { 
       TempData["adminmsg"] = "Song not saved"; 
       return View("Edit", model); 
      } 
     } 
     catch (Exception anyEx) 
     { 
      throw anyEx; 
     } 
    } 

C'est ce que saveSong() loo ks comme dans SqlSongRepository

public void SaveSong(Song song) 
    { 
     if (song.SongID == 0) 
     { 
      songTable.InsertOnSubmit(song); 
     } 
     else 
     { 
      songTable.Attach(song); 
      songTable.Context.Refresh(RefreshMode.KeepChanges, song); 
     } 

     songTable.Context.SubmitChanges(); 
    } 

[choses Contexte]

C'est le référentiel de contexte

public class ContextRepository : IContextRepository 
{ 
    private string connStr; 

    public ContextRepository(string connectionString) 
    { 
     this.connStr = connectionString; 
    } 

    public DataContext MasterContext 
    { 
     get { return new DataContext(connectionString); } 
    } 

    public string connectionString 
    { 
     get { return connStr; } 
    } 
} 

Dans le contrôleur de la chanson par exemple

public SongController(IContextRepository contextRepository) 
    { 
     this.contextRepository = contextRepository; 
     MasterContext = this.contextRepository.MasterContext; 
     DataHelper.InitContext(contextRepository); 

     songRepository = new SqlSongRepository(contextRepository.connectionString); 
    } 

Ensuite, le songRepository est utilisé comme J'ai posté avant.

+0

Est-ce que cela pourrait se produire à cause de la manière dont j'initialise mon contexte? Je l'afficherai dans un moment. – aredkid

Répondre

0

Eh bien, résolu le problème. Changement

songTable.Context.Refresh(RefreshMode.KeepChanges, song); 

à

songTable.Context.Refresh(RefreshMode.KeepCurrentValues, song); 

a fait l'affaire.

Je ne sais pas pourquoi, ce serait génial si quelqu'un pouvait expliquer.

Merci!

0

pourquoi ne pas essayer

public void SaveSong(Song song) 
{ 
    if (song.SongID == 0) 
    { 
     context.songTable.InsertOnSubmit(song); //adds as song 
    } 
    else 
    { 
     var _song = (from s in context.songTable 
        where s.ID == song.id 
        select s).Single(); 
     _song = song; //updates existing song 
    } 

    context.songTable.SubmitChanges(); 
} 

EDIT:

Voici un exemple de la façon dont je mettre à jour ma table Utilisateurs de mon dépôt (désolé il est en VB)

Public Class UserRepository : Implements IUserRepository 
    Private dc As MyDBDataContext 
    Public Sub New() 
     dc = New MyDBDataContext 
    End Sub 

    Public Sub AddUser(ByVal openid As OpenID) Implements IUserRepository.AddUser 
     Dim user As New User 
     user.MemberSince = DateTime.Now 
     openid.User = user 

     dc.OpenIDs.InsertOnSubmit(openid) 
    End Sub 

    Public Sub UpdateUser(ByVal user As User) Implements IUserRepository.UpdateUser 
     Dim _user = (From u In dc.Users 
      Where u.ID = user.ID 
      Select u).Single 

     With _user 
      .About = user.About 
      .BirthDate = user.BirthDate 
      .Email = user.Email 
      .isClosed = user.isClosed 
      .isProfileComplete = user.isProfileComplete 
      .RegionID = user.RegionID 
      .Reputation = user.Reputation 
      .UserName = user.UserName 
      .WebSite = user.WebSite 
     End With 

    End Sub 
End Class 

Puis, dans mon contrôleur Je décide si j'ajoute ou mise à jour.

+0

La modification de l'instance référencée par une variable locale ne "met pas à jour la chanson existante". Les dessous ne font pas non plus de magie. –

+0

c'est essentiellement la même chose, j'ai essayé de mettre à jour à partir d'une variable locale, en vain – aredkid

+0

@DavidB - Je n'ai pas "juste ajouter des traits de soulignement" - J'ai enlevé le "attach" et l'ai remplacé par une recherche sur un enregistrement avec les nouvelles données. C'est comme ça que je cours mes couches de dépôt et ça fonctionne fantastique. –