猿教程 Logo

DBEntityEntry Class

DBEntityEntry是一个重要的类,它是在检索实体的各种信息是非常有用的。

当EF从数据库中提取一条记录生成一个实体对象之后,应用程序可以针对它的操作太多了,EF是怎么知道哪个对象处于哪个状态的?

EF的解决方案是:为当前所有需要跟踪的实体对象,创建一个相应的DbEntityEntry对象,此对象包容着实体对象每个属性的三个值:

你可以使用一下方法得到一个特定实体的DBEntityEntry实例:

DBEntityEntry studentEntry = dbcontext.Entry(StudentEntity);

EF为每一个需要跟踪状态的实体对象创建一个对应的DbEntityEntry对象,保存实体对象各属性的Current Value、Original Value和Database Value三个值,只要比较这三个值,很容易地就知道哪个属性值被修改了,从而生成相应的Update命令。

下面的示例代码显示了如何检索一个特定实体的重要信息。

using (var dbCtx = new SchoolDBEntities())
{
    //get student whose StudentId is 1
    var student = dbCtx.Students.Find(1);
    //edit student name
    student.StudentName = "Edited name";
    //get DbEntityEntry object for student entity object
    var entry = dbCtx.Entry(student);
    //get entity information e.g. full name
    Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().FullName);
    //get current EntityState
    Console.WriteLine("Entity State: {0}", entry.State );
    Console.WriteLine("********Property Values********");
    foreach (var propertyName in entry.CurrentValues.PropertyNames )
    {
        Console.WriteLine("Property Name: {0}", propertyName);
        //get original value
        var orgVal = entry.OriginalValues[propertyName];
        Console.WriteLine("     Original Value: {0}", orgVal);
                    
        //get current values
        var curVal = entry.CurrentValues[propertyName];
        Console.WriteLine("     Current Value: {0}", curVal);
    }
}

输入结果如下:

Entity Name: Student

Entity State: Modified

********Property Values********

Property Name: StudentID

Original Value: 1

Current Value: 1

Property Name: StudentName

Original Value: First Student Name

Current Value: Edited name

Property Name: StandardId

Original Value:

Current Value:


DbEntityEntry使您能够设置一个实体的状态为:添加、修改或删除,如下所示:

context.Entry(student).State = System.Data.Entity.EntityState.Modified;

DBEntityEntry类有以下重要的方法:

名称描述
Collection(String)获取一个对象,该对象表示从该实体到相关实体集合的集合导航属性。
Collection(Of TElement)(Expression(Of Func(OfTEntity, ICollection(OfTElement))))获取一个对象,该对象表示从该实体到相关实体集合的集合导航属性。
Collection(Of TElement)(String)获取一个对象,该对象表示从该实体到相关实体集合的集合导航属性。
ComplexProperty(String)获取一个对象,此对象表示该实体的复杂属性。
ComplexProperty(OfTComplexProperty)(Expression(Of Func(OfTEntity, TComplexProperty)))获取一个对象,此对象表示该实体的复杂属性。
ComplexProperty(OfTComplexProperty)(String)获取一个对象,此对象表示该实体的复杂属性。
Equals(Object)确定指定的 Object 是否等于此实例。 如果两个 DbEntityEntry(TEntity) 实例都是同一 DbContext 上的同一实体的项,则将这两个实例视为相等。 (重写 Object.Equals(Object)。)
Equals(DbEntityEntry(OfTEntity))确定指定的 DbEntityEntry(TEntity) 是否等于此实例。 如果两个 DbEntityEntry(TEntity) 实例都是同一DbContext 上的同一实体的项,则将这两个实例视为相等。
Finalize(继承自 Object。)
GetDatabaseValues在数据库中查询跟踪实体的值的副本,因为当前它们位于数据库中。 请注意更改返回的字典中的值将不会更新数据库中的值。 如果未在数据库中找到实体,则返回 null。
GetDatabaseValuesAsync跟踪的实体当前位于数据库中时,在数据库中异步查询这些实体的值的副本。 请注意更改返回的字典中的值将不会更新数据库中的值。 如果未在数据库中找到实体,则返回 null。
GetDatabaseValuesAsync(CancellationToken)跟踪的实体当前位于数据库中时,在数据库中异步查询这些实体的值的副本。 请注意更改返回的字典中的值将不会更新数据库中的值。 如果未在数据库中找到实体,则返回 null。
GetHashCode返回此实例的哈希代码。 (重写 Object.GetHashCode。)
GetType获取当前实例的 Type。
GetValidationResult验证此 DbEntityEntry(TEntity) 实例并返回验证结果。
Member(String)获取表示实体成员的对象。 返回的对象的运行时类型将随要求的成员类型的不同而不同。 当前支持的成员类型及其返回类型为:引用导航属性:DbReferenceEntry. 集合导航属性:DbCollectionEntry. 基元/标量属性:DbPropertyEntry. 复杂属性:DbComplexPropertyEntry。
Member(Of TMember)(String)获取表示实体成员的对象。 返回的对象的运行时类型将随要求的成员类型的不同而不同。 当前支持的成员类型及其返回类型为:引用导航属性:DbReferenceEntry(Of TEntity, TProperty). 集合导航属性:DbCollectionEntry(Of TEntity, TElement). 基元/标量属性:DbPropertyEntry(Of TEntity, TProperty).复杂属性:DbComplexPropertyEntry(Of TEntity, TComplexProperty)。
MemberwiseClone(继承自 Object。)
Property(String)获取一个对象,此对象表示该实体的标量属性或复杂属性。
Property(Of TProperty)(Expression(Of Func(OfTEntity, TProperty)))获取一个对象,此对象表示该实体的标量属性或复杂属性。
Property(Of TProperty)(String)获取一个对象,此对象表示该实体的标量属性或复杂属性。
Reference(String)获取一个对象,该对象表示从该实体到其他实体的引用 (即非集合)导航属性。
Reference(OfTProperty)(Expression(Of Func(OfTEntity, TProperty)))获取一个对象,该对象表示从该实体到其他实体的引用 (即非集合)导航属性。
Reference(OfTProperty)(String)获取一个对象,该对象表示从该实体到其他实体的引用 (即非集合)导航属性。
Reload从数据库重新加载该实体时会用数据库中的值覆盖任何属性值。 调用此方法后,该实体将处于“未更改”状态。
ReloadAsync异步从数据库重新加载该实体时会用数据库中的值覆盖任何属性值。 调用此方法后,该实体将处于“未更改”状态。
ReloadAsync(CancellationToken)异步从数据库重新加载该实体时会用数据库中的值覆盖任何属性值。 调用此方法后,该实体将处于“未更改”状态。
ToString返回数据库实体值的字符串表示形式。 (重写 Object.ToString。)

访问MSDN 查看DBEntityEntry类的更多信息。



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