猿教程 Logo

断开状态下修改实体

在本章中,您将学习在断开的情况下如何更新一个单一的实体。

不论你是使用数据库优先(DB first)的做法创建一个实体数据模型,还是使用代码优先(Code first)或模型优先(Model first)方法创建实体类和上下文。

这几种开发法方法中的实体类和上下文类都基本类似。

在这里,我们将看到如何更新单个Student实体(不是实体图)。

下面是一个Student实体。

using System;
using System.Collections.Generic;
public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual Standard Standard { get; set; }
    public virtual StudentAddress StudentAddress { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

以下是一个上下文类。

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;
    
public partial class SchoolDBEntities : DbContext
{
    public SchoolDBEntities()
        : base("name=SchoolDBEntities")
    {
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
            
    }
    
    public virtual DbSet<Course> Courses { get; set; }
    public virtual DbSet<Standard> Standards { get; set; }
    public virtual DbSet<Student> Students { get; set; }
    public virtual DbSet<StudentAddress> StudentAddresses { get; set; }
    public virtual DbSet<Teacher> Teachers { get; set; }
}

下面的例子显示了如何在断开连接的场景更新Student实体:

Student stud;
//1. 从数据库获取Student对象
using (var ctx = new SchoolDBEntities())
{
    stud = ctx.Students.Where(s => s.StudentName == "New Student1").FirstOrDefault<Student>();
}
//2. 修改名称
if (stud != null)
{
    stud.StudentName = "Updated Student1";
}
//使用新的上下文对象保存对象
using (var dbCtx = new SchoolDBEntities())
{
    //3. 设置该对象的状态为Modified
    dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;     
        
    //4. 调用 SaveChanges方法
    dbCtx.SaveChanges();
}

正如你在上面的代码片段中所看到的,我们需要做以下步骤:

  1. 从DB得到现有的Student。

  2. 直接改变Student的名字(断开连接的模式)

  3. 传入修改后的Student对象到Entry方法来获取到该对象的DBEntityEntry 对象,然后设置该对象的状态为Modified。

  4. 调用SaveChanges()方法更新学生信息到数据库中。

SaveChanges将发送以下更新查询数据库:

exec sp_executesql N'update [dbo].[Student]
set [StudentName] = @0, [StandardId] = @1
where ([StudentID] = @2)',N'@0 varchar(50),
@1 int,@2 int',@0='Updated Student1',@1=299,@2=267

通过这种方式,我们可以很容易地使用DBContext更新一个单一的实体。

DbContext.Entry方法返回一个指定的实体的DBEntityEntry 实例。

DbEntityEntry类的实例提供关于一个给定的实体和它的状态的详细信息。

你可以改变实体的状态为Added,Updated或者Deleted。

在下一章,你将学习如何在非连接模式下删除一个单一的实体。



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/update-entity.html