1) 我尽量避免使用魔法字符串,除非它们是
真正实现功能的唯一手段
如果context 是ObjectContext (EF ObjectSet<Product>,名称为Products 或类似名称。然后你可以使用:
context.Products.AddObject(newProduct);
即使您的上下文中没有这样的集合,也有另一个强类型选项:
context.CreateObjectSet<Product>().AddObject(newProduct);
2) 它给出了 void 作为返回类型,我如何检查是否插入
好不好?
AddObject 根本不会将 INSERT 插入数据库。它仅将对象置于 objectContext 中的Added 状态。当您调用 SaveChanges 时,真正的 INSERT 会在单个事务中稍后发生。
尽管如此,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(DbSet<T> 的方法)而不是 AddObject。