不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
ASP.NET MVC3 + Entity Framework实现数据按需更新
编辑:dnawo 日期:2012-11-15
1.Entity Framework支持数据按需更新吗?
ASP.NET MVC3 + Entity Framework要实现数据按需更新,前提条件是Entity Framework要支持数据按需更新。我们先做个测试验证下,下边是一个实体类:
Entity Framework更新数据:
SQL Server Profiler跟踪结果:
引用内容
可见,Entity Framework支持数据按需更新。
2.ASP.NET MVC3 + Entity Framework还是按需更新吗?
View(注意没有PersonId):
Controller:
SQL Server Profiler跟踪结果:
引用内容
很明显,PersonId使用了默认值进行更新,下边我们对Controller代码稍做修改:
SQL Server Profiler跟踪结果:
引用内容
可见,修改后ASP.NET MVC3 + Entity Framework实现了数据按需更新:)
补充说明
[1].一定要有db.Pets.Attach(pet),否则运行会出错,提示:
引用内容
ASP.NET MVC3 + Entity Framework要实现数据按需更新,前提条件是Entity Framework要支持数据按需更新。我们先做个测试验证下,下边是一个实体类:
复制内容到剪贴板
程序代码

public class Pet
{
public Pet()
{
this.Id = 0;
this.PersonId = 0;
this.Name = "";
}
public int Id { get; set; }
public Nullable<int> PersonId { get; set; }
public string Name { get; set; }
}
{
public Pet()
{
this.Id = 0;
this.PersonId = 0;
this.Name = "";
}
public int Id { get; set; }
public Nullable<int> PersonId { get; set; }
public string Name { get; set; }
}
Entity Framework更新数据:
复制内容到剪贴板
程序代码

testContext db = new testContext();
Pet pet = db.Pets.FirstOrDefault();
pet.Name = "newname1";
db.SaveChanges();
Pet pet = db.Pets.FirstOrDefault();
pet.Name = "newname1";
db.SaveChanges();
SQL Server Profiler跟踪结果:

exec sp_executesql N'update [dbo].[Pet]
set [Name] = @0
where ([Id] = @1)
',N'@0 nvarchar(20),@1 int',@0=N'newname1',@1=1
set [Name] = @0
where ([Id] = @1)
',N'@0 nvarchar(20),@1 int',@0=N'newname1',@1=1
可见,Entity Framework支持数据按需更新。
2.ASP.NET MVC3 + Entity Framework还是按需更新吗?
View(注意没有PersonId):
复制内容到剪贴板
程序代码

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Pet</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
@Html.ValidationSummary(true)
<fieldset>
<legend>Pet</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
Controller:
复制内容到剪贴板
程序代码

[HttpPost]
public ActionResult Edit(Pet pet)
{
if (ModelState.IsValid)
{
db.Entry(pet).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(pet);
}
public ActionResult Edit(Pet pet)
{
if (ModelState.IsValid)
{
db.Entry(pet).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(pet);
}
SQL Server Profiler跟踪结果:

exec sp_executesql N'update [dbo].[Pet]
set [PersonId] = @0, [Name] = @1
where ([Id] = @2)
',N'@0 int,@1 nvarchar(20),@2 int',@0=0,@1=N'newname2',@2=1
set [PersonId] = @0, [Name] = @1
where ([Id] = @2)
',N'@0 int,@1 nvarchar(20),@2 int',@0=0,@1=N'newname2',@2=1
很明显,PersonId使用了默认值进行更新,下边我们对Controller代码稍做修改:
复制内容到剪贴板
程序代码

[HttpPost]
public ActionResult Edit(Pet pet)
{
if (ModelState.IsValid)
{
//var entry = db.Entry(pet);[1]
var entry = db.Entry(db.Pets.Attach(pet));
entry.Property("Name").IsModified = true;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(pet);
}
public ActionResult Edit(Pet pet)
{
if (ModelState.IsValid)
{
//var entry = db.Entry(pet);[1]
var entry = db.Entry(db.Pets.Attach(pet));
entry.Property("Name").IsModified = true;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(pet);
}
SQL Server Profiler跟踪结果:

exec sp_executesql N'update [dbo].[Pet]
set [Name] = @0
where ([Id] = @1)
',N'@0 nvarchar(20),@1 int',@0=N'newname3',@1=1
set [Name] = @0
where ([Id] = @1)
',N'@0 nvarchar(20),@1 int',@0=N'newname3',@1=1
可见,修改后ASP.NET MVC3 + Entity Framework实现了数据按需更新:)
补充说明
[1].一定要有db.Pets.Attach(pet),否则运行会出错,提示:

Member 'IsModified' cannot be called for property 'Name' because the entity of type 'Pet' does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<Pet>.






评论: 0 | 引用: 0 | 查看次数: 6474
发表评论
请登录后再发表评论!