我自己的一生

是你的,是我的,到底是谁的?

导航

 

增加新的实体

现在你已经有了编辑如何处理的概念,让我们再来看看,你的应用程序增添一个新的实体时,作为SaveChanges的一部分,是如何发生给数据库的。

在例子5-3中,一个新的实体Address在内存中被创建。然后,把Address匹配给从数据库查询出来的Contact之后,调用SaveChanges

 

注意

基于指定的场景,会有不同的多种方法彼此链接实体。在第15章中,你将会学到更多这个方面的知识。

 

例子5-3 在内存中创建一个新的Address

当新的Address被加入到Contact的时候,因为ObjectContext管理着Contact的环境,所以要为新的Address创建一个新的可认可的ObjectStateEntry。因为Address没有一致的关键键,所以EntityState被设置为Added。当SaveChanges被调用的时候,因为EntityState被设置为Added,所以一个Insert命令被构建处理,发生到数据库。

这里的命令是:

exec sp_executesql N'insert [dbo].[Address]([Street1], [Street2], [City],
 [StateProvince], [CountryRegion], [PostalCode], [AddressType], [ContactID],
 [ModifiedDate])
values (@0, null, @1, @2, null, null, @3, @4, @5)
select [addressID]
from [dbo].[Address]
where @@ROWCOUNT > 0 and [addressID] = scope_identity()',
N'@0 nchar(15),@1 nchar(10),@2 nchar(2),@3 nchar(8),@4 int,@5 datetime2(7)',
@0=N'One Main Street',@1=N'Burlington',@2=N'VT',@3=N'Business',
@4=209,@5='2008-11-22 20:19:58.7090000'

 

5.3.1 分解成本地的Insert命令

前面的参数化的命令有许多需要注意的地方。

首先,插入一个AddressInsert命令的使用实体的每个属性(Property)。注意,即使编码没有没有设置所有的属性,插入默认下,使用所有的属性。这个场景下的Null,将不会被在代码中明确使用。

第五行向下是Select命令的开始,附着在插入的新Address中,命令将会为新的Address获取数据库生成的关键主键。作Savechanges的一部分,应用程序编码中的新Address要接受来自数据库的AddressID,以便可以持续你希望的编码工作。

在命令中要指出的最后一个事情是,Insert命令中的一个字段是ContactIDAddress实体中没有ContactID属性,ContactAddress直接的关系是通过导航属性维护的,它是Contact的外键值ContactID的映射。创建本地命令的过程的一部分是识别出关系,通过这个关系确定是否被用到Address中。

当插入完成时,不但Address在内存中,有了它的AddressID,而且就像上面所说的刷新,EntityState将会被设置为Unchanged