LINQ to SQL nicht-Datenbank Datensätze in MVC 2-Anwendung zu aktualisieren
-
02-10-2019 - |
Frage
Mit MVC 2 Ich habe versucht, diesen Plattenladen Projekt zu machen. Aufzeichnungen Arbeit zu schaffen, sondern sie tut nicht aktualisiert. sind entweder keine Ausnahmen geworfen.
Ich untersuchte getchangeset () direkt vor SubmitChanges () es zeigt alle Nullen.
Vielen Dank für Ihre Lesung und Sie Hilfe:)
Die Edit-Ansicht:
<% 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...
Edit-Funktion
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")
}
}
editieren Funktion
[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;
}
}
Dies ist, was Savesong () sieht aus wie in 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();
}
[Kontext Dinge]
Dies ist der Kontext-Repository
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; }
}
}
In dem Song-Controller zum Beispiel
public SongController(IContextRepository contextRepository)
{
this.contextRepository = contextRepository;
MasterContext = this.contextRepository.MasterContext;
DataHelper.InitContext(contextRepository);
songRepository = new SqlSongRepository(contextRepository.connectionString);
}
Dann wird die songRepository verwendet, wie ich vorher geschrieben.
Lösung 2
Nun, das Problem gelöst. Ändern
songTable.Context.Refresh(RefreshMode.KeepChanges, song);
songTable.Context.Refresh(RefreshMode.KeepCurrentValues, song);
hat den Trick.
Ich weiß nicht, warum, es wäre toll, wenn jemand erklären könnte.
Danke!
Andere Tipps
warum nicht versuchen,
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:
Hier ist ein Beispiel dafür, wie ich meine Tabelle Benutzer aus meinem Repository aktualisieren (sorry, es ist in 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
Da ist in meinem Controller entscheide ich, wenn ich hinzufügen oder aktualisieren.