1)我尽量避免使用魔术字符串,除非它们真的是实现功能的唯一手段
如果context是ObjectContext(EF <= 4.0),您通常应该在派生上下文中有一个成员,它代表ObjectSet<Product>带有名称Products或类似名称的 。然后你可以使用:
context.Products.AddObject(newProduct);
即使您的上下文中没有这样的集合,也有另一个强类型选项:
context.CreateObjectSet<Product>().AddObject(newProduct);
2)它给出了 void 作为返回类型,我如何检查插入是否良好?
AddObject根本不执行 INSERT 到数据库中。它仅将对象置于AddedobjectContext 中的状态。真正的 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。