2

我正在使用ADO.NET Entity Framework在 C# 中开发应用程序。

在网络上的许多示例中,我看到为了向newProduct实体添加元素,让我们假设Product,它使用以下代码:

context.Products.Add(newProduct);

但是,Add 方法不是其中的成员,Products因此我无法使用它。也许示例中使用的 EF 是 LinqToSQL。

但是在 ADO.NET 中有一种方法AddObject

context.AddObject("Products", newProduct)

它有效,但我不喜欢它有两个原因:

1)我尽量避免使用魔术字符串,除非它们真的是实现功能的唯一手段

2)它给出了void作为返回类型,我如何检查插入是否良好?

我相信还有另一种方法可以插入我的实体。有人可以帮忙吗?

4

1 回答 1

4

1)我尽量避免使用魔术字符串,除非它们真的是实现功能的唯一手段

如果contextObjectContext(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(...)您所看到的很可能contextDbContext(EF >= 4.1)的示例。DbContext是实体框架的简化 API(它仍然使用底层的核心ObjectContext)。在此 API 中,插入新实体的方法确实称为Add(method of DbSet<T>) 而不是AddObject

于 2012-04-06T17:16:29.497 回答