1)我尽量避免使用魔术字符串,除非它们真的是实现功能的唯一手段
如果context
是ObjectContext
(EF <= 4.0),您通常应该在派生上下文中有一个成员,它代表ObjectSet<Product>
带有名称Products
或类似名称的 。然后你可以使用:
context.Products.AddObject(newProduct);
即使您的上下文中没有这样的集合,也有另一个强类型选项:
context.CreateObjectSet<Product>().AddObject(newProduct);
2)它给出了 void 作为返回类型,我如何检查插入是否良好?
AddObject
根本不执行 INSERT 到数据库中。它仅将对象置于Added
objectContext 中的状态。真正的 INSERT 稍后会在您调用SaveChanges
.
尽管如此,AddObject
可能会失败,也许如果您将具有相同键的两个对象添加到上下文中(如果您的实体没有键的自动生成标识),或者出于其他原因。如果是这样,AddObject
将抛出一个您不应该捕获的异常,因为它通常表明您的代码中存在严重的问题或错误。
SaveChanges
返回一个int
. 但这int
并不表示SaveChanges
插入对象是成功的。它只计算 SQL 语句执行前对象上下文中处于Added
状态(将导致 INSERT 语句)、处于Modified
状态(将导致 UPDATE 语句)和处于Deleted
状态(将导致 DELETE 语句)的对象的数量。
同样,如果任何 SQL 语句(如您的 INSERT)不成功,SaveChanges
将引发异常。异常可以表明客户端已经存在问题,或者它可以告诉您在 SQL 操作期间发生了问题 - 例如:对于失败的 INSERT,异常可能会给您一条消息,指出 INSERT 失败,因为已经有一行带有键您要在数据库中插入,或者您要插入的实体中未填写所需的不可为空的列等。在许多其他异常类型中,由于并发问题也可能出现异常。
SaveChanges
您可以通过捕获可能的异常来检查是否成功:
try
{
int numberOfObjects = context.SaveChanges();
}
catch (SomeExceptionType e)
{
// What now?
}
顺便说一句:context.Products.Add(...)
您所看到的很可能context
是DbContext
(EF >= 4.1)的示例。DbContext
是实体框架的简化 API(它仍然使用底层的核心ObjectContext
)。在此 API 中,插入新实体的方法确实称为Add
(method of DbSet<T>
) 而不是AddObject
。