LINQ到SQL未更新MVC 2中的数据库记录
-
02-10-2019 - |
题
使用MVC 2,我一直在尝试制作此唱片商店项目。创建记录工作,但更新它们却没有。也没有例外。
我在bubsitchanges()之前检查了getchangeset()。它显示了所有零。
感谢您的阅读和帮助:)
编辑视图:
<% 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...
编辑功能
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")
}
}
编辑帖子功能
[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;
}
}
这就是sqlsongrepository中的Savesong()的样子
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();
}
上下文
这是上下文存储库
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; }
}
}
例如,在歌曲控制器中
public SongController(IContextRepository contextRepository)
{
this.contextRepository = contextRepository;
MasterContext = this.contextRepository.MasterContext;
DataHelper.InitContext(contextRepository);
songRepository = new SqlSongRepository(contextRepository.connectionString);
}
然后,如我之前发布的Songrepository。
解决方案 2
好吧,解决了问题。更改
songTable.Context.Refresh(RefreshMode.KeepChanges, song);
到
songTable.Context.Refresh(RefreshMode.KeepCurrentValues, song);
做到了。
我不知道为什么,如果有人可以解释,那将是很棒的。
谢谢!
其他提示
为什么不尝试
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();
}
编辑:
这是我如何从存储库更新用户表的一个示例(对不起,它在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
然后,在我的控制器中,我决定要添加或更新。
不隶属于 StackOverflow