猿教程 Logo

断开连接下的实体操作

前面我们已经看到如何对断开连接的实体图执行CRUD操作,让我们看一下如何将断开连接的实体图与新的上下文实例连接起来。

当我们得到断开连接的实体图或者一个断开连接的实体时,我们需要做有两件事:

首先,我们需要将实体附加到新的上下文实例,使上下文意识到这些实体。

第二,手动设置适当的实体状态到这些实体,因为新的上下文实例不知道任何关于对断开连接的实体的操作,因此新的上下文不清楚该实体的状态。

下图说明了这个过程。


实体框架API提供了一些重要的方法,使高度分离的实体能附加到新的上下文,并且能为实体图中每一个实体设置实体状态。


DbSet.Add():

DbSet.Add()方法可以把整个实体图附加到新的上下文,并自动设置所有实体的实体状态为Added。


参考下面的示例代码。

    //分离的实体图
    Student disconnectedStudent = new Student() { StudentName = "New Student" };
    disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" };
    using (var ctx = new SchoolDBEntities())
    {
        //添加分离的实体到上下文
        ctx.Students.Add(disconnectedStudent);
                
        // 获取实体的状态
        var studentEntry = ctx.Entry(disconnectedStudent);
        var addressEntry = ctx.Entry(disconnectedStudent.StudentAddress);
        Console.WriteLine("Student EntityState: {0}",studentEntry.State);
        Console.WriteLine("StudentAddress EntityState: {0}",addressEntry.State);
    }

输入结果:

Student EntityState: Added 
StudentAddress EntityState: Added

根据上面的示例代码,我们使用ctx.Students添加disconnectedStudent实体图。


这里,父实体是Student,所以我们在Students DbSet中添加了一个完整的实体图。

然后我们得到Student和StudentAddress 的DbEntityEntry对象检查每个实体的状态。

正如你在输出中所看到的,两个实体都添加状态。


因此,使用Add方法将整个实体图连接到新的上下文实例后,每个实体状态的状态都为Added。

这将为所有的实体执行insert命令,向对应的数据库表中插入新行。



DbSet.Attach():

DbSet.Attach方法将整个实体图附加到新的上下文并不变实体的状态。

参考下面的示例代码。

    //disconnected entity graph
    Student disconnectedStudent = new Student() { StudentName = "New Student" };
    disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" };
    using (var ctx = new SchoolDBEntities())
    {
        //attach disconnected Student entity graph to new context instance - ctx
        ctx.Students.Attach(disconnectedStudent);
                
        // get DbEntityEntry instance to check the EntityState of specified entity
        var studentEntry = ctx.Entry(disconnectedStudent);
        var addressEntry = ctx.Entry(disconnectedStudent.StudentAddress);
        Console.WriteLine("Student EntityState: {0}",studentEntry.State);
        Console.WriteLine("StudentAddress EntityState: {0}",addressEntry.State);
    }

输出结果:

Student EntityState: Unchanged 
StudentAddress EntityState: Unchanged

根据上面的代码,我们可以使用 DbSet.Attach方法将断开连接的实体图附加到新的上下文。

这将把整个实体图所有实体附加到新上下文,但不变实体状态。


因此, DbSet.Attach只会附加实体图到上下文,所以我们需要找到合适的实体状态并手动为每个实体设置状态。



DbContext.Entry():

DbContext的Entry方法返回指定的实体的DbEntityEntry实例。

DbEntityEntry可以用来改变实体的状态。

DbContext.Entry(disconnectedEntity).state = EntityState.Added/Modified/Deleted/Unchanged


Parent Entity StateEntity State of child entities
AddedAdded
ModifiedUnchanged
DeletedAll child entities will be null



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